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.

Siehe auch:

SYSTEM$EXPLAIN_PLAN_JSON, SYSTEM$EXPLAIN_JSON_TO_TEXT, EXPLAIN_JSON

Syntax

EXPLAIN [ USING { TABULAR | JSON | TEXT } ] <statement>
Copy

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

step

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.

id

Jeder Operation im Abfrageplan wird ein eindeutiger Bezeichner zugewiesen.

parentOperators

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.

operation

Name der Operation, z. B. Ergebnis, Filter, TableScan, Join usw.

objects

Name des Objekts, auf das durch eine Tabellenscanoperation verwiesen wird, z. B. Tabelle, materialisierte Ansicht oder sichere Ansicht.

alias

Alias eines referenzierten Objekts, wenn dem Objekt in der Abfrage ein Alias zugewiesen wurde.

expressions

Liste der für die aktuelle Operation relevanten Ausdrücke wie Filter, Verknüpfungsprädikate, Projektionen, Aggregationen usw.

totalPartitions

Die Gesamtzahl der Mikropartitionen im referenzierten Datenbankobjekt.

assignedPartitions

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.

assignedBytes

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);
Copy

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 |
+------+------+-----------------+-------------+------------------------------+-------+--------------------------+-----------------+--------------------+---------------+
Copy

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} |
|                                                                                                                                    |
+------------------------------------------------------------------------------------------------------------------------------------+
Copy

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}]]} |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Copy