Apexトリガでエラー発生
Apexトリガ内でSOQLを発行しているとき、対象オブジェクトのレコード数が200,000件以上で以下のエラーが発生しました。
System.QueryException: Non-selective query against large object type (more than 200000 rows)
上記は以下の状態のときに発生するようです。
- 対象オブジェクト上のレコード件数が 200,000 レコード以上
- SOQL の WHERE 句に使用されている項目に 外部ID / カスタムインデックスが付与されていない
- 外部ID / カスタムインデックスが付与されていたとしても、インデックスが有効に動作する条件に合致していない
【参考】https://help.salesforce.com/articleView?id=000176875&language=ja&type=1
対応内容
簡単なのは、[設定]→[オブジェクトマネージャ]→[オブジェクト名]→[項目とリレーション]より、項目の編集を実施して「外部 ID」にチェックを入れる方法です。
ですが、項目の性質上外部IDに設定したくない場合があるかと思います。(一意にならないなど)
その場合はSalesforceサポートに以下の内容で問合せを行い、対象の項目にカスタムインデックスを付与してもらいましょう。
a.組織ID
b.対象のSOQL全文
※SOQL に変数がふくまれている場合には、具体的な値を記載して下さい。
例) SELECT Name FROM Account WHERE Test_c = 'TEST'
c.実行ユーザ名(メール形式)
※ログイン時に利用するメール形式のユーザ名となります。
d.カスタムインデックスの有効性を確認した後、即時に付与を行って良いか [ はい/いいえ ]
e.対象オブジェクトのAPI名
※取引先オブジェクトであればAccountとなります。
f.対象項目のAPI名
※項目名が取引先の電話番号だった場合はPhone、カスタム項目にて項目名をTestと指定した場合はTest_cとなります。
【参考】https://help.salesforce.com/articleView?id=000193930&language=ja&type=1