Tworzymy niestandardowe aplikacje w Salesforce które są zbudowane na podstawie danych klientów lub danych transakcyjnych z tabel danych Salesforce. Pisanie wydajnych zapytań ma kluczowe znaczenie dla utrzymania wydajności tych aplikacji i zapewnienia, że nie napotkamy limitów Salesforce. Istnieją pewne techniki optymalizacji, których należy przestrzegać, aby zapytanie było wydajne. Ten artykuł rzuci światło na te techniki.
O wydajności zapytań
Oczywiste jest, że wydajność zapytania zależy całkowicie od złożoności danych, które aktualnie znajdują się w Państwa organizacji produkcyjnej. Można napisać wydajne zapytanie, które działa w jednym środowisku, ale może zawieść w innym środowisku. Dlatego ważne jest, aby zrozumieć aktualny stan danych w środowisku produkcyjnym. Należy również mieć pojęcie o przyszłym wzroście danych produkcyjnych, aby móc odpowiednio zaplanować zapytania. Proszę uczynić planowanie zapytań częścią cyklu rozwoju. Proszę rutynowo sprawdzać stare zapytania w środowisku produkcyjnym, aby upewnić się, że są one nadal wydajne. Ten artykuł przeprowadzi Państwa również przez narzędzia, których można użyć do pomiaru wydajności zapytań w Salesforce.
Pierwszym krokiem w kierunku zoptymalizowanego zapytania jest użycie pól indeksu w filtrach klauzuli WHERE.
Indeksy
Niektóre pola są indeksowane w Salesforce po wyjęciu z pudełka. Podczas pisania zapytań proszę upewnić się, że używają Państwo tych pól jako filtrów, aby zoptymalizować zapytanie.
Poza domyślnie indeksowanymi polami, mogą Państwo również utworzyć niestandardowe pola jako indeksy. W tym celu należy skontaktować się z pomocą techniczną Salesforce. Proszę zauważyć, że identyfikator zewnętrzny z powyższej listy należy do kategorii indeksów niestandardowych.
Jeśli indeksowanie jest właściwą drogą, czy wystarczy ustawić wszystkie filtry jako indeksy i wszystko jest w porządku? Odpowiedź brzmi: “Nie”. Salesforce stosuje “próg selektywności” dla zapytań i tak długo, jak zapytanie pobiera dane poniżej tego progu, zapytanie jest selektywne lub zoptymalizowane. Jakie są progi?
- Standardowy próg indeksu: 30% pierwszych 1 mln rekordów i 15% pozostałych rekordów z maksymalnym limitem 1 mln rekordów.
- Niestandardowy próg indeksu: 10% pierwszych 1 mln rekordów i 5% pozostałych rekordów z maksymalnym limitem 333 333 rekordów.
Dla przykładu, proszę rozważyć następujące zapytanie i założyć, że mają Państwo około 2 milionów rekordów szans.
SELECT Id, name from Opportunity where RecordTypeId = '1234'
Ponieważ korzystają Państwo ze standardowego indeksu, próg wynosi 450 tys. rekordów (300 tys. + 150 tys.). Jeśli zapytanie zwraca więcej niż 450 tys. rekordów, zapytanie nie jest selektywne, a Salesforce Optimizer raczej przejdzie do skanowania tabeli. Jeśli użyje Pan niestandardowego filtra indeksu, próg wyniesie 150 tys.
Najczęstsze błędy w zapytaniach
- Używanie
!=
lubNOT
– Nawet jeśli pole jest indeksowane, użycie!=
lubNOT
nie sprawią, że Państwa zapytania będą selektywne. Zamiast tego proszę użyćIN
lub=
. - Proszę użyć
%wildcards%
– Jeśli mają Państwo problem z używaniem%wildcards
w swoich zapytaniach, proszę się cofnąć i zadać sobie pytanie, czy SOSL jest lepszą opcją. - Unikanie zer – proszę rozważyć następujący kod:
List<Opportunity> oppList = [SELECT id, customLookup__c from Opportunity];
list<String> Ids = new List<String>();
for (Opporunity opp : oppList){
Ids.add(opp.customLookup__c);
}
List<customObject__c> objs = [SELECT id from customObject__c where Id in: Ids];
Jeśli mają Państwo możliwość z customlookup__c=null
, Państwa lista będzie miała wartość null, a Państwa zapytanie na stronie customObject__c
nie będzie selektywne. Aby to naprawić, proszę dodać customLookup__c
do Ids
proszę wymienić tylko jeśli customLookup__c !=null
.
4. Usunięte rekordy mogą wpływać na wydajność zapytań – Proszę użyć isDeleted = false
lub opróżnić kosz, aby poprawić wydajność zapytań.
Proszę sprawdzić wydajność zapytań
Istnieją dwa sposoby sprawdzenia wydajności zapytania bez konieczności jego uruchamiania.
- Zapytanie Salesforce REST resource with an
'Explain'
parametr - Plan zapytań z konsoli programisty
Atrybuty wydajności zapytań
Po uruchomieniu planu zapytań przy użyciu powyższych dwóch metod, zobaczą Państwo “plany zapytań” z następującymi kluczowymi atrybutami.
- Kardynalność – Szacowana liczba rekordów, które zwróci wiodący typ operacji.
- SObject Cardinality – Przybliżona liczba rekordów dla obiektu zapytania
- Wiodący typ operacji – Podstawowy typ operacji, którego Salesforce użyje do optymalizacji zapytania; Dwa popularne typy to indeks i skanowanie tabel.
- relativeCost lub Cost – Koszt zapytania w porównaniu do progu selektywności; Jeśli koszt jest wyższy niż 1, zapytanie nie jest selektywne.
Proszę zauważyć, że przez większość czasu w odpowiedzi można znaleźć wiele planów. Plan o minimalnym koszcie zostanie wykorzystany przez Salesforce.
Wnioski
Pisanie wydajnych zapytań ma kluczowe znaczenie dla utrzymania wydajności Państwa systemu w Salesforce. Istnieją pewne techniki, aby Państwa zapytanie było efektywne, takie jak używanie indeksów jako filtrów i utrzymywanie wyników zapytania w granicach progu selektywności. Istnieją również narzędzia, takie jak plan zapytań w konsoli deweloperskiej lub przy użyciu funkcji explain
w zasobie REST zapytania, aby zmierzyć wydajność zapytania. Proszę upewnić się, że korzystają Państwo z tych technik i narzędzi podczas sesji projektowych, aby móc pisać selektywne zapytania i zapewnić najwyższą wydajność swoich aplikacji.