2017-06-09 255 views
0

我想这个查询:顶点查询优化

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]; 

它给了我一个错误:

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 = :tmpVar1 AND RecordTypeId = :tmpVar2) 10:12:05.0 (11489528)|EXCEPTION_THROWN|[49]|System.QueryException: Non-selective query against large object type (more than 200000 rows). Consider an indexed filter or contact salesforce.com about custom indexing.

我明白uniqueNiInputSet.size()〜50,所以,这不是一个问题,但对于该记录类型,它可能包含更多的记录。

那么,如果我改变了职位将工作?首先是记录类型,然后是where子句中的NIset。是否有顺序如何在SF中选择where子句。那么,它只会查找50个成员,然后在50个以内,它将查找特定的记录类型?

回答

0

这只是意味着脚本执行时间太长。您可能需要将其移至@future方法或使用Database.Batchable进行执行。

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

0

非选择性查询意味着你正在执行针对有大量的记录表的查询和您的查询是不够具体。您可以使用Salesforce支持来尝试解决此问题,无论是通过创建其他后端索引还是通过使查询更具选择性。 说实话,你的查询看起来很有选择性,你没有使用LIKE或IN。您还应该首先将最具选择性的条件(导致对记录更加集中的查询)。
我知道这不重要,但我也会将你的条件从括号中移出。 如果您可以过滤其他任何字段,这可能会有所帮助。有时,您必须实际创建新字段并填充它们,以帮助您更有选择性地进行查询。 另外,如果rr_National_Insurance_Number__c是一个公式域,你会希望将其更改为一个文本框,并填充工作流或顶点来代替。公式字段需要额外的时间在服务器上进行计算。

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 
0

您的查询是非选择性的。对于一个标准的指标是拳头万条记录,30%和超过一百万条记录15%,达100万个记录总。对于与“和”查询每个单独的其中标准本身必须是选择性看到this快速参考备忘单。在一般情况下,请尝试制作

rr_National_Insurance_Number__c

一个外部ID,默认情况下会使其由salesforce索引并重试您的查询。记录类型默认已编入索引。如果结果是因为返回的结果数量还是非选择性,尝试使用像CreatedDate字段限制查询的范围限制的结果数量。