Select Apex查询优化

Select Apex查询优化,select,salesforce,query-optimization,apex,soql,Select,Salesforce,Query Optimization,Apex,Soql,我正在尝试以下查询: List<Account> onlyRRCustomer = [SELECT ac.rr_First_Name__c, ac.rr_Last_Name__c, ac.rr_National_Insurance_Number__c,

我正在尝试以下查询:

List<Account> onlyRRCustomer = [SELECT
                                   ac.rr_First_Name__c,
                                   ac.rr_Last_Name__c,
                                   ac.rr_National_Insurance_Number__c,
                                   ac.id,
                                   ac.rr_Date_of_Birth__c
                               FROM
                                   Account ac
                               WHERE
                                   ac.rr_National_Insurance_Number__c IN :uniqueNiInputSet
                                   AND RecordTypeId  = :recordTypeId];
List only yrrcustomer=[选择
ac.rr_名字____c,
ac.rr_姓氏____c,
ac.rr\国家\保险\编号\ c,
ac.id,
出生日期出生日期
从…起
帐户ac
哪里
ac.rr\国家\保险\编号\输入:唯一输入
和RecordTypeId=:RecordTypeId];
这给了我一个错误:

选择ac.rr\u First\u Name\u c、ac.rr\u Last\u Name\u c, ac.rr\U国家保险号、ac.id、ac.rr\U日期、出生日期 账户ac其中(ac.rr\国家\保险\编号\ c=:tmpVar1和 RecordTypeId=:tmpVar2)10:12:05.0 (11489528)|抛出异常|[49]| System.QueryException:非选择性 查询大型对象类型(超过200000行)。考虑一个 索引过滤器或联系salesforce.com了解自定义索引

我理解uniqueNiInputSet.size()~50,所以这不是问题,但对于该记录类型,它可能包含更多记录


那么,如果我换了职位,那行吗?表示,首先是recordtype,然后是where子句中的NIset。SF中where子句的选择是否有顺序。因此,它将只查找50个成员,然后在50个成员内搜索特定的记录类型?

这意味着脚本执行时间太长。您可能需要将其移动到@future方法,或者使用Database.Batchable执行它


我认为顺序在SOQL中并不重要,我认为它只是试图返回太多的记录。

非选择性查询意味着您正在对包含大量记录的表执行查询,并且您的查询不够具体。您可以与Salesforce支持部门合作,尝试通过创建额外的后端索引或使查询更具选择性来解决此问题。 老实说,您的查询看起来已经很有选择性了,您没有使用LIKE或IN。您还应该将最具选择性的条件放在首位(从而对您的记录进行更有针对性的查询)。
我知道这不要紧,但我也会把你的条件从括号中去掉。 如果您可以筛选其他字段,这可能会有所帮助。有时,您必须实际创建新字段并填充它们,以帮助提高查询的选择性。 此外,如果rr_National_Insurance_Number___c是一个公式字段,则需要将其更改为文本字段并填充工作流或apex。公式字段需要服务器上的额外时间来计算

SELECT rr_First_Name__c, rr_Last_Name__c, rr_National_Insurance_Number__c, id, rr_Date_of_Birth__c 
FROM Account
WHERE new_custom_field__c = TRUE 
AND rr_National_Insurance_Number__c = :tmpVar1
AND RecordTypeId = :tmpVar2

您的查询是非选择性的。对于一个标准,第一个百万条记录的索引是30%,超过一百万条记录的索引是15%,最多一百万条记录。对于和“和”查询,每个条件本身必须是选择性的,请参阅快速参考备忘单。总的来说,试着做些什么

rr\U国家保险号\U\U c

一个外部id,默认情况下会使其成为salesforce的索引,然后重试查询。默认情况下,记录类型已编制索引。如果由于返回的结果数量,结果仍然是非选择性的,请尝试使用CreatedDate之类的字段限制结果数量,以限制查询的范围