Non-selective query against large object type (more than 200000 rows)
Salesforce为了保证执行效率,SOQL 查询必须有选择性的减少要扫描数据的数量,特别是在触发器内部发起的SOQL查询。
同时为了避免执行时间过长,系统可以终止非选择性的 SOQL 查询。 当触发器中的非选择的性查询的对象超过 20万条记录的,系统会抛出一条错误消息。 那为避免此错误,需要SOQL查询语句是有效率的。
为了写出有效率的SOQL,你要先理解几个概念:
Standard Index:标准索引,包括Id,Name,OwnerId,Master-detail fields,Lookup fields
Customed Index:自定义索引,Salesforce针对自定义字段同样可以设置成索引字段,编辑字段以后,勾选external Id外键以后,便成了被标记成索引得字段。外键仅可以Auto Number / Email / Number / Text类型中创建
Index Selectivity Exceptions:有些特殊情况下,就算是用了索引字段也是无效的,比如!=,NOT LIKE, EXCLUDE, 针对文本字段的比较操作,使用了"%"匹配符等
碰到这个错误,给SOQL查询添加LIMIT是没有用的,唯一的办法就是修改你的查询条件,特别是针对索引字段进行条件过滤,减少查询范围。
相关资源:
https://help.salesforce.com/s/articleView?id=000333150&type=1
http://resources.docs.salesforce.com/rel1/doc/en-us/static/pdf/salesforce_query_search_optimization_developer_cheatsheet.pdf
https://www.cnblogs.com/zero-zyq/p/14250870.html