【Salesforce】Non-selective query against large object type

【Salesforce】Non-selective query against large object type

Salesforceでリリースを行った後の確認作業にて、エラーが発生しました。

System.QueryException: Non-selective query against large object type (more than 100000 rows). Consider an indexed filter or contact salesforce.com about custom indexing. Even if a field is indexed a filter might still not be selective when: 1. The filter value includes null (for instance binding with a list that contains null) 2. Data skew exists whereby the number of matching rows is very large (for instance, filtering for a particular foreign key value that occurs many times):

長いですね。

知識として知ってはいたのですが、初めて見るエラーです。

トリガ内のSOQLでレコード数が10万件以上あるレコードに対してクエリを実行すると死ぬようです。

検索条件にインデックス化された項目を含めることで、これを解決できます。

今回は重複チェック用のSOQLで発生したため、インデックス化項目を作るのはそれほど難しくありませんでした。

ちなみに、Id、Name、監査日付項目(例: LastModifiedDate)はデフォルトでインデックス化されているそうです。

IdやNameを検索条件に指定すると、パフォーマンスが高くなるんだとか。

これはトリガ内の検索条件に関わらず、覚えておくと便利そうですね。

http://blogjp.sforce.com/2010/09/soql-3067.html

元々はName項目を検索条件にしていたのですが、それを別の項目に変更したのが原因でした。

完全な考慮不足ですね。

というか、発生するまでこのエラーのことをすっかり忘れていました。

No comments.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です