Jak zoptymalizować zapytanie SOQL, gdy mam 15 milionów rekordów kont?
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
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.