Loading

FAQ zum Abfrageplan-Tool der Entwicklerkonsole

Veröffentlichungsdatum: Aug 30, 2024
Beschreibung
Das Abfrageplan-Tool in der Entwicklerkonsole kann SOQL-Abfragen über große Datenmengen beschleunigen. Verwenden Sie das Abfrageplan-Tool zur Optimierung und Beschleunigung von Abfragen, die über große Volumina durchgeführt werden. 
 

Aktivieren und Verwenden des Abfrageplan-Tools

    1. Klicken Sie in der Entwicklerkonsole auf Hilfe | Einstellungen
    2. Setzen Sie 'Abfrageplan aktivieren' auf TRUE.

    Nach der Aktivierung in der Entwicklerkonsole können Sie auf das Abfrageplan-Tool in der Registerkarte 'Abfrage-Editor' der Konsole zugreifen.

    Um das Abfrageplan-Tool zu verwenden, geben Sie einfach eine Abfrage in den Abfrage-Editor ein und drücken Sie Abfrageplan, um alle Abfrageoperationen und die Kosten für jede einzelne der bereitgestellten SOQL anzuzeigen.
    Lösung

    Gründe für die Verwendung des Abfrage-Tools

     

    Verwenden Sie dieses Tool, um den Abfrageplan aller (oder 'von allen') SOQL-Abfragen zu überprüfen, die langsam ausgeführt werden. Es wird Ihnen einen Einblick in die verschiedenen Pläne geben, und sollten Sie einige der Filter katalogisiert haben, erhalten Sie die Kosten für die Verwendung des Index im Vergleich zu einem vollständigen Tabellen-Scan.
    Wenn die Kosten für den Tabellen-Scan niedriger sind als der Index und die Abfrage aussetzt, sollten Sie andere Filter verwenden, um die Selektivität zu verbessern. Andernfalls können Sie auch einen anderen selektiven Filter in dieser Abfrage verwenden, der vielleicht nicht indiziert ist, aber evtl. dafür in Frage kommen würde.

    Bestimmen Sie, ob ein Filter selektiv ist:

    • Ermitteln Sie, ob er einen Index hat.
    • Wenn der Filter auf einem Standardfeld angewendet wird, hat er einen Index, wenn es sich um einen Primary Key (Id, Name, OwnerId), einen Foreign Key (CreatedById, LastModifiedById, Lookup, Master-Detail-Beziehung) und ein Audit-Feld (CreatedDate, SystemModstamp) handelt.
    • Benutzerdefinierte Felder haben einen Index, wenn sie als Unique oder External Id markiert wurden.
    • Wenn der Filter keinen Index hat, wird er für die Optimierung nicht berücksichtigt.
    • Wenn der Filter einen Index hat, bestimmen Sie, wie viele Datensätze er zurückgeben würde:
    • Für einen Standard-Index liegt der Höchstwert bei 30 Prozent der ersten Million gewünschter Datensätze und bei 15 Prozent aller Datensätze nach dieser ersten Million. Darüber hinaus liegt der Grenzbereich der Selektion für einen Standardindex bei maximal 1 Million Datensätzen, die Sie nur erreichen können, wenn Sie mehr als 5,6 Millionen Datensätze insgesamt haben.
    • Bei einem benutzerdefinierten Index liegt die Selektivitätsschwelle bei 10 Prozent der ersten Million gezielter Datensätze und bei 5 Prozent aller Datensätze nach dieser ersten Million.  Darüber hinaus liegt die Selektivitätsschwelle für einen benutzerdefinierten Index bei maximal 333.333 Datensätzen, die Sie nur erreichen können, wenn Sie über mehr als 5,6 Millionen Datensätze verfügen.
    • Wenn der Filter den Grenzwert überschreitet, wird er nicht für eine Optimierung in Betracht gezogen.
    • Wenn der Filter den Schwellenwert nicht überschreitet, IST dieser Filter selektiv, und der Abfrageoptimierer wird ihn für die Optimierung in Betracht ziehen.
     

    Was bedeutet das alles?

    Das Abfrageplan-Tool zeigt eine Liste der verfügbaren Pläne, die unser Abfrageoptimierer für die bereitgestellte Abfrage verwenden kann, und wird nach Kosten aufsteigend sortiert.

    Jeder Plan enthält Informationen über Kardinalität, Operationstyp, Kosten, sObjekt-Typ und mehr. Jeder Plan hat einen 'führenden Operationstyp', z.B. Feldindex oder Full Table Scan. Der Plan mit den niedrigsten Kosten ist der Plan, der für die Ausführung der Abfrage verwendet wird.
     

    Kardinalität
    Felder
    Führender Operationstyp
    Kosten
    sObject Kardinalität
    sObject-Typ
    Die geschätzte Anzahl der Datensätze, die der führende Operationstyp zurückgeben würde.
    Zum Beispiel die Anzahl der zurückgegebenen Datensätze bei Verwendung einer Indextabelle.
     
    Das/die indizierte(n) Feld(er), das/die vom Abfrageoptimierer verwendet wird/werden. Wenn die führende Operationsart Index ist, ist der Feldwert Index. Andernfalls ist der Feldwert null.Der Hauptvorgangstyp, den Salesforce zur Optimierung der Abfrage verwendet.
    • Index - Die Abfrage verwendet einen Index auf das abgefragte Objekt.
    • Sharing - Die Abfrage verwendet einen Index, der auf den Freigaberegeln basiert, die dem Benutzer zugeordnet sind, der die Abfrage ausführt. Wenn es Freigaberegeln gibt, die einschränken, auf welche Datensätze dieser Benutzer zugreifen kann, kann Salesforce diese Regeln zur Optimierung der Abfrage verwenden..
    • TableScan - Die Abfrage durchsucht alle Datensätze nach dem abgefragten Objekt.
    • Other - Die Abfrage verwendet Salesforce-interne Optimierungen.
    Die Kosten der Abfrage im Vergleich zum Selektivitätsschwellenwert des Force.com-Abfrageoptimierers. Werte über 1 bedeuten, dass die Abfrage nicht selektiv ist.Die ungefähre Anzahl der Datensätze für das abgefragte Objekt.    Der Name des abgefragten Objekts

     

    Wie werden die Kosten ermittelt?

    Jeder Plan hat seinen eigenen Kostenfaktor. Der Kostenfaktor wird aus den zuletzt gesammelten Datenbankstatistiken (DB-Statistiken) über die Tabelle und die Werte abgeleitet. Der Plan mit den niedrigsten Kosten wird der verwendete Plan sein. Wenn der Kostenfaktor über 1 liegt, bedeutet dies, dass die Abfrage nicht selektiv ist.

    Ein indiziertes Feld erscheint nicht auf der Planliste

    Wenn die von Ihnen bereitgestellte Abfrage ein indiziertes Feld in den Filtern enthält, wird der Plan für dieses Feld nur dann angezeigt, wenn Sie eine unterstützte Operation für dieses Feld verwenden.

    Hier ist eine Liste der nicht unterstützten Operationen:
     

    • Der benutzerdefinierte Index wird niemals verwendet, wenn Vergleiche mit einem Operator wie "NOT EQUAL TO" durchgeführt werden.
    • Der benutzerdefinierte Index wird niemals verwendet, wenn Vergleiche mit einem Nullwert wie "Name = ''" durchgeführt werden.
    • Führende '%'-Platzhalter sind ineffiziente Betreiber, die auch Filterbedingungen als nicht-selektiv einstufen.
    • Bei Verwendung eines OR-Vergleichs müssen alle Filter indiziert sein und unter der 10%-Schwelle liegen. Wenn Sie ein nicht-indiziertes Feld haben oder eines über 10% liegt, wird der Plan nicht angezeigt.

     

    Zeigt das Abfrageplan-Tool Indexkandidaten an, oder Felder, die indiziert werden können?

    Das Abfrageplan-Tool zeigt nur indizierte Feldstatistiken im Bereich des Abfrageplans an, nicht aber Felder, die indiziert werden könnten. Dieses Tool stellt keine Informationen über Felder bereit, die indiziert werden können.

    Siehe hierzu Wie mache ich meine SOQL-Abfrage selektiv , um zu bestimmen, welche Felder indiziert werden können.

    Beispiele und wie man die Query-Plan-Ergebnisse interpretiert 

    Das folgende Beispiel verwendet 2 indizierte Felder. Ein Kontrollkästchen (InActiveAcc__c) und eine Picklist (Account_Hierarchy__c) auf dem Account sObjekt. 

    Hinweis: Weitere Beispielabfragen finden Sie im ursprünglichen Beitrag über den Query Resource Feedback Parameter Pilot, aus dem dieses neue Tool für die Entwicklerkonsole entstanden ist. 

     

    Beispiel-Abfrage 1

    SELECT count() FROM Account WHERE Account_Hierarchy__c = 'Parent'


    Szenario: Ein indiziertes Feld mit einer selektiven Bindungsvariablen

    Das Feld "Account_Hierarchy__c" ist indiziert, so dass es für einen Plan mit der führenden Vorgangsart als "Index" in Betracht gezogen wurde. Das indizierte Feld ist kostengünstiger als der TableScan, daher wird der Index vom Abfrageoptimierer für diese Abfrage auf dem Kontoobjekt mit 50.088 Zeilen verwendet.
     

    Beispiel-Abfrage 2

    SELECT count() FROM Account WHERE InActiveAcc__c = true AND Account_Hierarchy__c = 'Parent'


    Szenario: 2 indizierte Felder, 1 selektiv

    Was passiert, wenn mehr als ein einfacher Filter selektiv ist? Wenn sich mehr als ein Filter als selektiv herausstellt, wählt der Abfrageoptimierer denjenigen mit den geringeren Kosten, um den Ausführungsplan der Abfrage zu steuern.
     

    Beispiel-Abfrage 3

    SELECT count() FROM Account WHERE InActiveAcc__c = true  AND Account_Hierarchy__c != 'Parent'  **HINWEIS: Verwendung einer nicht unterstützten Operation auf dem Index**


    Szenario: 2 indizierte Felder, 1 selektives ABER unter Verwendung einer nicht unterstützten Operation


    Der Index auf Account_Hierarchy__c wird aufgrund der nicht unterstützten Operation von "!=" nicht verwendet oder berücksichtigt.  Beachten Sie auch, dass InActiveAcc__c verwendet wird, aber höhere Kosten als 1 verursacht. Wie bereits erwähnt, ist der Filter nicht selektiv, wird aber verwendet.

     

    Beispiel-Abfrage 4

    SELECT count() FROM Account WHERE Account_Hierarchy__c = 'Child'


    Szenario: 1 indiziertes Feld unter Verwendung einer nicht-selektiven Bindungsvariablen (>10% der Zeilenanzahl des sObjekts)

    Hier zeigt das indizierte Feld Account_Hierarchy__c wesentlich höhere Kosten als ein vollständiger Tabellenscan. Der Grund dafür ist, dass der Index nicht selektiv ist, wobei die bindende Variable "Kind" mehr als 10% der vollständigen Tabelle ausmacht. Die DB führt für diese Abfrage einen vollständigen Tabellen-Scan durch, was je nach Größe der vollständigen Tabelle zu einer schlechten Leistung führen kann.

    Referenzen und empfohlene Informationen

    Nummer des Knowledge-Artikels

    000386864

     
    Laden
    Salesforce Help | Article