EXPLAIN

指定された SQL ステートメントの論理的実行プランを返します。

説明プランは、Snowflakeがクエリを実行するために実施する操作(テーブルスキャンや結合など)を表示します。

こちらもご参照ください。

SYSTEM$EXPLAIN_PLAN_JSONSYSTEM$EXPLAIN_JSON_TO_TEXTEXPLAIN_JSON

構文

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

パラメーター

statement

これは、実行計画を作成したいSQLステートメントです。

USING output_format

このオプションの句は、出力形式を指定します。可能な出力形式は次のとおりです。

  • JSON: JSON出力はテーブルとクエリに保存するのが簡単です。

  • TABULAR: 通常、人にとって読みやすい出力形式はJSONよりも表形式です。

  • TEXT:通常、人にとって読みやすい出力形式は JSON よりもフォーマットされたテキストです。

デフォルトは TABULAR です。

出力

出力には次の情報が含まれます。

説明

step

ほとんどのクエリには単一のステップが含まれていますが、複数の別個のステップとして実行されるステップもあります。この列は、操作が属するステップを示します。

id

クエリプランの各操作に割り当てられた一意の識別子。

parentOperators

操作の親ノード向け識別子の配列。クエリプロファイルでは親が、親と子を接続するリンクと子の上に表示されます。

operation

操作の名前。例:結果、フィルター、 TableScan、結合など

objects

テーブルスキャン操作によって参照されるオブジェクトの名前(テーブル、マテリアライズドビュー、セキュアビューなど)。

alias

クエリでオブジェクトにエイリアスが与えられている場合、参照されるオブジェクトのエイリアス。

expressions

フィルター、結合述語、投影、集計など、現在の操作に関連する式のリスト。

totalPartitions

参照されるデータベースオブジェクト内のマイクロパーティションの総数。

assignedPartitions

コンパイル時のプルーニング後に残される参照オブジェクトからのパーティションの数、つまりクエリによってスキャンされる可能性のあるパーティションの数。

assignedBytes

assignedPartitionsに含まれるバイト数。

使用上の注意

  • EXPLAIN SQL ステートメントをコンパイルしますが、実行はしません。したがって、 EXPLAIN は実行中のウェアハウスを必要としません。

  • EXPLAIN は計算クレジットを消費しませんが、クエリのコンパイルは、他のメタデータ操作と同様に、クラウドサービスクレジットを消費します。

  • このコマンドの出力を後処理するには、次の手順に従います。

    • このコマンドの出力を後処理するには、 RESULT_SCAN 関数を使用できます。この関数は、出力をクエリ可能なテーブルとして扱います。

    • 出力を JSON 形式で生成し、後で分析するために JSON 形式の出力をテーブルに挿入します。出力を JSON 形式で保存する場合は、関数 SYSTEM$EXPLAIN_JSON_TO_TEXT または EXPLAIN_JSON を使用して、 JSON をより読みやすい形式(表形式または書式付きテキスト)に変換できます。

  • assignedPartitionsおよびassignedBytesの値は、クエリ実行の上限推定値です。結合プルーニングなどのランタイム最適化により、クエリ実行中にスキャンされるパーティションとバイトの数を減らすことができます。

  • EXPLAIN プランは、「論理的な」説明プランです。実行される操作と、相互の論理的な関係性を示します。プラン内における操作の実際の実行順序は、プランで示される論理的な順序と必ずしも一致しません。

  • EXPLAIN ステートメントのいずれかのデータベースオブジェクトが INFORMATION_SCHEMA オブジェクトである場合、ステートメントはエラー EXPLAIN command has insufficient privilege on object <objName> で失敗します。

この例は、小さなテーブル2つに対する単純なクエリの EXPLAIN 出力を示しています。

テーブルを作成します。

CREATE TABLE Z1 (ID INTEGER);
CREATE TABLE Z2 (ID INTEGER);
CREATE TABLE Z3 (ID INTEGER);
Copy

クエリの EXPLAIN プランを表形式で生成します。

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

クエリの EXPLAIN プランをフォーマットされたテキストとして生成します。

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

クエリの EXPLAIN プランを JSON として生成します。

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