Dostrajanie zapytań Salesforce

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.

Lista pól do wykorzystania w celu optymalizacji zapytania

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

  1. Używanie != lub NOT – Nawet jeśli pole jest indeksowane, użycie != lub NOT nie sprawią, że Państwa zapytania będą selektywne. Zamiast tego proszę użyć IN lub =.
  2. 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ą.
  3. 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.

  1. Zapytanie Salesforce REST resource with an 'Explain' parametr
  2. Plan zapytań z konsoli programisty

Wybór metody HTTP do wykonania na identyfikatorze URI usługi REST API

Menu pomocy -> Preferencje -> Włącz plan zapytań
Plan zapytań/Edytor zapytań

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 CardinalityPrzybliż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.