2017-06-09 55 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字段限制查詢的範圍限制的結果數量。