EXPLAIN ステートメント
SQL ステートメントの実行計画を表示します。
構文:
例:
EXPLAIN の種類
AST— 抽象構文木 (Abstract Syntax Tree)。SYNTAX— AST レベルの最適化後のクエリテキスト。QUERY TREE— Query Tree レベルの最適化後のクエリツリー。PLAN— クエリ実行プラン。PIPELINE— クエリ実行パイプライン。
EXPLAIN AST
クエリの AST をダンプします。SELECT だけでなく、あらゆる種類のクエリをサポートします。
例:
EXPLAIN SYNTAX
クエリの構文解析後の抽象構文木 (AST) を表示します。
クエリをパースしてクエリ AST とクエリツリーを構築し、必要に応じてクエリアナライザと最適化パスを実行し、その後クエリツリーを再度クエリ AST に変換することで動作します。
設定:
oneline– クエリを 1 行で出力します。デフォルト:0。run_query_tree_passes– クエリツリーを出力する前に、クエリツリーに対する各種パスを実行します。デフォルト:0。query_tree_passes–run_query_tree_passesが設定されている場合に、実行するパスの回数を指定します。query_tree_passesを指定しない場合は、すべてのパスを実行します。
例:
出力:
run_query_tree_passes を使用した場合:
出力:
EXPLAIN QUERY TREE
設定:
run_passes— クエリツリーをダンプする前にすべてのクエリツリーパスを実行します。デフォルト:1。dump_passes— クエリツリーをダンプする前に、使用したパスに関する情報をダンプします。デフォルト:0。passes— 実行するパスの数を指定します。-1に設定すると、すべてのパスを実行します。デフォルト:-1。dump_tree— クエリツリーを表示します。デフォルト:1。dump_ast— クエリツリーから生成されたクエリの AST を表示します。デフォルト:0。
例:
EXPLAIN PLAN
クエリプランのステップを出力します。
設定:
header— ステップの出力ヘッダーを表示します。デフォルト: 0。description— ステップの説明を表示します。デフォルト: 1。indexes— 使用されたインデックス、それぞれのインデックスに対してフィルタリングされたパーツ数およびフィルタリングされたグラニュール数を表示します。デフォルト: 0。MergeTree テーブルでサポートされています。ClickHouse >= v25.9 以降、このステートメントはSETTINGS use_query_condition_cache = 0, use_skip_indexes_on_data_read = 0と組み合わせて使用した場合にのみ、意味のある出力を返します。projections— 解析されたすべてのプロジェクションと、そのプロジェクションの主キー条件に基づくパーツレベルでのフィルタリングへの影響を表示します。各プロジェクションについて、このセクションには、プロジェクションの主キーを用いて評価されたパーツ数、行数、マーク数、およびレンジ数といった統計情報が含まれます。また、プロジェクション自体を読み取ることなく、このフィルタリングによってスキップされたデータパーツの数も表示されます。プロジェクションが実際に読み取りに使用されたのか、フィルタリングのために解析されただけなのかは、descriptionフィールドで判別できます。デフォルト: 0。MergeTree テーブルでサポートされています。actions— ステップアクションに関する詳細情報を表示します。デフォルト: 0。json— クエリプランのステップを JSON フォーマットの 1 行として表示します。デフォルト: 0。不要なエスケープを避けるために TabSeparatedRaw (TSVRaw) フォーマットの使用を推奨します。input_headers— ステップの入力ヘッダーを表示します。デフォルト: 0。主に、入出力ヘッダーの不整合に関連する問題をデバッグする開発者にとって有用です。
json=1 の場合、ステップ名には一意のステップ識別子を含む追加のサフィックスが付きます。
Example:
ステップおよびクエリのコスト推定はサポートされていません。
json = 1 の場合、クエリプランは JSON 形式で表現されます。すべてのノードは、必ず Node Type と Plans というキーを持つ辞書です。Node Type はステップ名を表す文字列です。Plans は子ステップの説明を含む配列です。その他の任意のキーは、ノードの種類および設定に応じて追加される場合があります。
例:
description = 1 の場合、そのステップに Description キーが追加されます。
header を 1 に設定すると、Header キーが列の配列としてステップに追加されます。
例:
indexes = 1 の場合、Indexes キーが追加されます。そこには使用されたインデックスの配列が含まれます。各インデックスは、Type キー(文字列 MinMax、Partition、PrimaryKey または Skip)と、以下の任意のキーを持つ JSON として記述されます:
Name— インデックス名(現在はSkipインデックスでのみ使用されます)。Keys— インデックスで使用される列の配列。Condition— 使用された条件式。Description— インデックスの説明(現在はSkipインデックスでのみ使用されます)。Parts— インデックス適用前後のパーツ数。Granules— インデックス適用前後のグラニュール数。Ranges— インデックス適用後のグラニュール範囲の数。
例:
projections = 1 の場合、Projections キーが追加されます。このキーには解析されたプロジェクションの配列が含まれます。各プロジェクションは、以下のキーを持つ JSON として表されます:
Name— プロジェクション名。Condition— そのプロジェクションで使用される主キー条件。Description— プロジェクションの利用方法の説明(例: パートレベルでのフィルタリング)。Selected Parts— プロジェクションによって選択されたパート数。Selected Marks— 選択されたマーク数。Selected Ranges— 選択された範囲数。Selected Rows— 選択された行数。Filtered Parts— パートレベルのフィルタリングによりスキップされたパート数。
例:
actions = 1 の場合、追加されるキーはステップの種類に依存します。
例:
EXPLAIN PIPELINE
設定:
header— 各出力ポートのヘッダーを出力します。デフォルト: 0。graph— DOT グラフ記述言語で表現されたグラフを出力します。デフォルト: 0。compact—graph設定が有効な場合に、グラフをコンパクトモードで出力します。デフォルト: 1。
compact=0 かつ graph=1 のとき、プロセッサ名には一意のプロセッサ識別子を含む追加のサフィックスが付きます。
例:
EXPLAIN ESTIMATE
クエリを処理する際にテーブルから読み取られる行数・マーク数・パーツ数の推定値を表示します。MergeTree ファミリーのテーブルで使用できます。
例
テーブルの作成:
クエリ:
結果:
EXPLAIN TABLE OVERRIDE
テーブル関数経由でアクセスするテーブルスキーマに対してテーブルオーバーライドを適用した結果を表示します。 また、オーバーライドによって不整合やエラーが発生する場合には、例外をスローするなどの検証も行います。
例
次のようなリモートの MySQL テーブルがあるとします。
結果:
検証は完了していないため、クエリが成功しても、その override によって問題が発生しないことは保証されません。