EXPLAIN¶
Gibt den logischen Ausführungsplan für die angegebene SQL-Anweisung zurück.
Ein EXPLAIN-Plan zeigt die Operationen (z. B. Tabellenscans und Joins), die Snowflake ausführen würde, um die Abfrage auszuführen.
Syntax¶
EXPLAIN [ USING { TABULAR | JSON | TEXT } ] <statement>
Parameter¶
statement
Dies ist die SQL-Anweisung, für die Sie den EXPLAIN-Plan wünschen.
USING output_format
Diese optionale Klausel gibt das Ausgabeformat an. Die möglichen Ausgabeformate sind:
JSON: JSON-Ausgaben lassen sich einfacher in Tabellen und Abfragen speichern.
TABULAR: Die tabellarische Ausgabe ist im Allgemeinen besser lesbar als die JSON-Ausgabe.
TEXT: Die formatierte Textausgabe ist im Allgemeinen besser lesbar als die JSON-Ausgabe.
Der Standardwert ist TABULAR.
Ausgabe¶
Die Ausgabe enthält die folgenden Informationen:
Spalte |
Beschreibung |
---|---|
|
Die meisten Abfragen enthalten einen einzelnen Schritt, einige werden jedoch als mehrere unterschiedliche Schritte ausgeführt. Diese Spalte gibt an, zu welchem Schritt die Operation gehört. |
|
Jeder Operation im Abfrageplan wird ein eindeutiger Bezeichner zugewiesen. |
|
Array von Bezeichnern für die übergeordneten Knoten der Operation. Im Abfrageprofil wird ein übergeordnetes Element über seinem untergeordneten Element mit einem Link angezeigt, der die beiden verbindet. |
|
Name der Operation, z. B. Ergebnis, Filter, TableScan, Join usw. |
|
Name des Objekts, auf das durch eine Tabellenscanoperation verwiesen wird, z. B. Tabelle, materialisierte Ansicht oder sichere Ansicht. |
|
Alias eines referenzierten Objekts, wenn dem Objekt in der Abfrage ein Alias zugewiesen wurde. |
|
Liste der für die aktuelle Operation relevanten Ausdrücke wie Filter, Verknüpfungsprädikate, Projektionen, Aggregationen usw. |
|
Die Gesamtzahl der Mikropartitionen im referenzierten Datenbankobjekt. |
|
Die Anzahl der Partitionen aus dem referenzierten Objekt, die nach dem Bereinigen zur Kompilierungszeit übrig bleiben, d. h. die Anzahl der Partitionen, die möglicherweise von der Abfrage gescannt werden. |
|
Die Anzahl der Bytes, die in assignedPartitions enthalten sind. |
Nutzungshinweise¶
EXPLAIN kompiliert die SQL-Anweisung, führt sie jedoch nicht aus, sodass für EXPLAIN kein aktives Warehouse erforderlich ist.
Obwohl EXPLAIN keine Compute-Credits verbraucht, werden wie bei allen anderen Metadatenoperationen auch bei der Kompilierung der Abfrage Clouddienst-Credits verbraucht.
Um die Ausgabe dieses Befehls nachzubearbeiten, können Sie Folgendes tun:
Verwenden Sie die Funktion RESULT_SCAN, die die Ausgabe wie eine abfragbare Tabelle behandelt.
Generieren der Ausgabe im JSON-Format und einfügen der JSON-formatierten Ausgabe in eine Tabelle zur späteren Analyse. Wenn Sie die Ausgabe im JSON-Format speichern, können Sie die Funktion SYSTEM$EXPLAIN_JSON_TO_TEXT oder EXPLAIN_JSON verwenden, um die JSON-Ausgabe in ein besser lesbares Format (entweder tabellarischer oder formatierter Text) zu konvertieren.
Die Werte für „assignPartitions“ und „assignBytes“ sind Schätzungen der oberen Grenze für die Ausführung von Abfragen. Durch Laufzeitoptimierungen wie das Bereinigen von Verknüpfungen lässt sich die Anzahl der Partitionen und Bytes reduzieren, die während der Ausführung der Abfrage gescannt werden.
Der EXPLAIN-Plan ist der „logische“ Erklärungsplan. Er zeigt die Operationen an, die ausgeführt werden, und deren logische Beziehung zueinander. Die tatsächliche Ausführungsreihenfolge der Operationen im Plan entspricht nicht unbedingt der im Plan angezeigten logischen Reihenfolge.
Wenn zu den Datenbankobjekten in der EXPLAIN-Anweisung INFORMATION_SCHEMA-Objekte gehören, schlägt die Anweisung mit dem Fehler
EXPLAIN command has insufficient privilege on object <Name_des_Objekts>
fehl.
Beispiele¶
Dieses Beispiel zeigt die EXPLAIN-Ausgabe für eine einfache Abfrage auf zwei kleinen Tabellen.
Erstellen Sie die Tabellen:
CREATE TABLE Z1 (ID INTEGER); CREATE TABLE Z2 (ID INTEGER); CREATE TABLE Z3 (ID INTEGER);Generieren Sie den EXPLAIN-Plan für die Abfrage in Tabellenform:
EXPLAIN USING TABULAR SELECT Z1.ID, Z2.ID FROM Z1, Z2 WHERE Z2.ID = Z1.ID; +------+------+-----------------+-------------+------------------------------+-------+--------------------------+-----------------+--------------------+---------------+ | step | id | parentOperators | operation | objects | alias | expressions | partitionsTotal | partitionsAssigned | bytesAssigned | |------+------+-----------------+-------------+------------------------------+-------+--------------------------+-----------------+--------------------+---------------| | NULL | NULL | NULL | GlobalStats | NULL | NULL | NULL | 2 | 2 | 1024 | | 1 | 0 | NULL | Result | NULL | NULL | Z1.ID, Z2.ID | NULL | NULL | NULL | | 1 | 1 | [0] | InnerJoin | NULL | NULL | joinKey: (Z2.ID = Z1.ID) | NULL | NULL | NULL | | 1 | 2 | [1] | TableScan | TESTDB.TEMPORARY_DOC_TEST.Z2 | NULL | ID | 1 | 1 | 512 | | 1 | 3 | [1] | JoinFilter | NULL | NULL | joinKey: (Z2.ID = Z1.ID) | NULL | NULL | NULL | | 1 | 4 | [3] | TableScan | TESTDB.TEMPORARY_DOC_TEST.Z1 | NULL | ID | 1 | 1 | 512 | +------+------+-----------------+-------------+------------------------------+-------+--------------------------+-----------------+--------------------+---------------+Generieren Sie den EXPLAIN-Plan für die Abfrage als formatierten Text:
EXPLAIN USING TEXT SELECT Z1.ID, Z2.ID FROM Z1, Z2 WHERE Z2.ID = Z1.ID; +------------------------------------------------------------------------------------------------------------------------------------+ | content | |------------------------------------------------------------------------------------------------------------------------------------| | GlobalStats: | | partitionsTotal=2 | | partitionsAssigned=2 | | bytesAssigned=1024 | | Operations: | | 1:0 ->Result Z1.ID, Z2.ID | | 1:1 ->InnerJoin joinKey: (Z2.ID = Z1.ID) | | 1:2 ->TableScan TESTDB.TEMPORARY_DOC_TEST.Z2 ID {partitionsTotal=1, partitionsAssigned=1, bytesAssigned=512} | | 1:3 ->JoinFilter joinKey: (Z2.ID = Z1.ID) | | 1:4 ->TableScan TESTDB.TEMPORARY_DOC_TEST.Z1 ID {partitionsTotal=1, partitionsAssigned=1, bytesAssigned=512} | | | +------------------------------------------------------------------------------------------------------------------------------------+Generieren Sie den EXPLAIN-Plan für die Abfrage im JSON-Format:
EXPLAIN USING JSON SELECT Z1.ID, Z2.ID FROM Z1, Z2 WHERE Z2.ID = Z1.ID; +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | content | |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | {"GlobalStats":{"partitionsTotal":2,"partitionsAssigned":2,"bytesAssigned":1024},"Operations":[[{"id":0,"operation":"Result","expressions":["Z1.ID","Z2.ID"]},{"id":1,"parentOperators":[0],"operation":"InnerJoin","expressions":["joinKey: (Z2.ID = Z1.ID)"]},{"id":2,"parentOperators":[1],"operation":"TableScan","objects":["TESTDB.TEMPORARY_DOC_TEST.Z2"],"expressions":["ID"],"partitionsAssigned":1,"partitionsTotal":1,"bytesAssigned":512},{"id":3,"parentOperators":[1],"operation":"JoinFilter","expressions":["joinKey: (Z2.ID = Z1.ID)"]},{"id":4,"parentOperators":[3],"operation":"TableScan","objects":["TESTDB.TEMPORARY_DOC_TEST.Z1"],"expressions":["ID"],"partitionsAssigned":1,"partitionsTotal":1,"bytesAssigned":512}]]} | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+