【问题标题】:Apex query optimizationApex 查询优化
【发布时间】:2017-06-09 09:46:20
【问题描述】:

我正在尝试这个查询:

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

它给了我一个错误:

选择 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 账户 ac WHERE (ac.rr_National_Insurance_Number__c = :tmpVar1 AND RecordTypeId = :tmpVar2) 10:12:05.0 (11489528)|EXCEPTION_THROWN|[49]|System.QueryException:非选择性 针对大型对象类型(超过 200000 行)进行查询。考虑一个 索引过滤器或联系 salesforce.com 了解自定义索引。

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

那么,如果我改变了位置,那会起作用吗?意味着,首先是记录类型,然后是 where 子句中的 NIset。是否有任何顺序如何在 SF 中选择 where 子句。那么,它只会寻找 50 个成员,然后在 50 个内搜索特定的记录类型?

【问题讨论】:

    标签: select salesforce query-optimization apex soql


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      非选择性查询意味着您正在对具有大量记录的表执行查询,并且您的查询不够具体。您可以通过 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
      

      【讨论】:

        【解决方案3】:

        您的查询是非选择性的。对于标准索引,前一百万条记录占 30%,超过一百万条到 100 万条记录的记录占 15%。对于和“AND”查询每个人,其中条件本身必须是选择性的,请参阅this 快速参考备忘单。一般尝试制作

        rr_National_Insurance_Number__c

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-25
          • 2012-06-15
          • 2011-01-19
          • 1970-01-01
          相关资源
          最近更新 更多