【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.