Wie kann ich die SOQL-Abfrage optimieren, wenn ich 15 Millionen Kontodatensätze habe?
Ich habe einen Anwendungsfall, in dem ich einen benutzerdefinierten Rest-Dienst verfügbar mache, der die Telefonnummer als Argument akzeptiert und mit den fünf Telefonnummernfeldern auf dem Konto vergleicht und den einzelnen Datensatz zurückgibt, der mit einer der fünf Telefonnummern übereinstimmt. Falls mehrere Datensätze gefunden werden, sollte der früheste erstellte Datensatz zurückgegeben werden. Meine einzige Sorge / mein einziges Problem ist, wenn dies in die Produktion geht, wird es nicht funktionieren / es wird ein Leistungsproblem geben, da es 15 Millionen Kontodatensätze gibt. Ich kann die Felder wahrscheinlich indizieren, aber hilft das wirklich, wenn die Anzahl der Datensätze so hoch ist? Ich würde mich sehr über Vorschläge/Hilfe zur Optimierung dieses SOQL freuen.
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: Ich habe das Biz-Team bereits gefragt, ob wir beim Vergleich nur ein Feld für die Telefonnummer haben können. Aber sie sind unnachgiebig mit fünf Feldern.
Antworten
Dies ist stattdessen der perfekte Anwendungsfall für SOSL. Du kannst tun:
FIND :phoneNumber
IN PHONE FIELDS
RETURNING Account(
Id
WHERE RecordType.Name='Person Account'
ORDER BY CreatedDate
LIMIT 1
)
Hinweis: Wenn es sich bei einem dieser benutzerdefinierten Felder um Formelfelder handelt, werden diese Datensätze bei diesem Ansatz übersehen, da Formelfelder nicht suchindiziert sind. Aus Leistungsgründen müssen Sie die Werte tatsächlich in den zu durchsuchenden Datensatz kopieren.
Diese Aussage würde übrigens auch mit SOQL stimmen; Sie müssen die Abfrage selektiv machen, was bedeutet, dass keine Formelfelder verwendet werden. Solange alle gefilterten Felder indiziert sind, sollte Ihre ursprüngliche Abfrage auch bei 15 Millionen Datensätzen kein Problem darstellen.