Jak zoptymalizować zapytanie SOQL, gdy mam 15 milionów rekordów kont?

Aug 15 2020

Mam przypadek użycia, w którym ujawniam niestandardową usługę Rest, która akceptuje numer telefonu jako argument i porównuje z pięcioma polami numeru telefonu na koncie i zwraca pojedynczy rekord pasujący do jednego z pięciu numerów telefonów. W przypadku znalezienia wielu rekordów należy zwrócić najwcześniej utworzony rekord. Moim jedynym problemem / problemem jest to, że kiedy to trafi do produkcji, nie zadziała / wystąpi problem z wydajnością, ponieważ istnieje 15 milionów rekordów na koncie. Prawdopodobnie mogę zindeksować pola, ale czy to naprawdę pomoże, gdy liczba rekordów jest tak wysoka? Byłbym naprawdę wdzięczny za wszelkie sugestie / pomoc w optymalizacji tej 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: Zapytałem już zespół Biz, czy podczas porównania możemy mieć tylko jedno pole phone #. Ale są nieugięci z pięcioma polami.

Odpowiedzi

3 sfdcfox Aug 15 2020 at 19:51

Zamiast tego jest to idealny przypadek użycia dla SOSL. Możesz to zrobić:

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

Uwaga: Jeśli którekolwiek z tych pól niestandardowych jest polami z formułami, to podejście spowoduje pominięcie tych rekordów, ponieważ pola formuł nie są indeksowane podczas wyszukiwania. Ze względu na wydajność należy faktycznie skopiować wartości do przeszukiwanego rekordu.

Nawiasem mówiąc, to stwierdzenie nadal byłoby prawdziwe w przypadku SOQL; musisz uczynić zapytanie selektywnym, co oznacza, że ​​nie używasz pól formuł. Dopóki wszystkie przefiltrowane pola są indeksowane, wówczas pierwotne zapytanie nie powinno stanowić problemu, nawet przy 15 milionach rekordów objętości danych.