Как оптимизировать запрос SOQL, когда у меня 15 миллионов записей учетной записи?

Aug 15 2020

У меня есть случай использования, когда я представляю настраиваемую службу Rest, которая будет принимать номер телефона в качестве аргумента и сравнивать с пятью полями номера телефона в учетной записи и возвращать единственную запись, соответствующую любому из пяти номеров телефонов. В случае, если найдено несколько записей, должна быть возвращена самая ранняя созданная запись. Моя единственная забота / проблема заключается в том, что когда это идет в производство, это не сработает / возникнет проблема с производительностью, поскольку существует 15 миллионов записей учетной записи. Я, вероятно, смогу проиндексировать поля, но действительно ли это поможет, когда количество записей так велико? Я был бы очень признателен за любые предложения / помощь по оптимизации этого SOQL.

SOQL:

[SELECT Id 
FROM Account 
WHERE RecordType=’Person Account’ 
AND (Parent_Phone_Number__c= :phoneNo OR Student_Phone_Number__c= :phoneNo OR 
Alternate_Number_1__c= :phoneNo OR Alternate_Number_2__c= :phoneNo OR 
Alternate_Number_3__c= :phoneNo)
ORDER BY CreatedDate DESC 
LIMIT 1];

PS: Я уже спросил команду Biz, можем ли мы иметь только одно поле phone # при сравнении. Но они непреклонны с пятью полями.

Ответы

3 sfdcfox Aug 15 2020 at 19:51

Вместо этого это идеальный вариант использования SOSL. Ты можешь сделать:

FIND :phoneNumber 
IN PHONE FIELDS
RETURNING Account(
  Id 
  WHERE RecordType.Name='Person Account'
  ORDER BY CreatedDate
  LIMIT 1
)

Примечание. Если какое-либо из этих настраиваемых полей является полями формул, при таком подходе эти записи будут пропущены, поскольку поля формул не индексируются при поиске. Вам нужно фактически скопировать значения в поисковую запись по соображениям производительности.

Между прочим, это утверждение было бы справедливо и для SOQL; вам необходимо сделать запрос выборочным, то есть не использовать поля формул. Пока все отфильтрованные поля проиндексированы, ваш исходный запрос не должен быть проблемой даже при 15 миллионах записей объема данных.