13 KiB
slug | sidebar_position | sidebar_label | title |
---|---|---|---|
/ja/sql-reference/statements/explain | 39 | EXPLAIN | EXPLAIN ステートメント |
ステートメントの実行計画を表示します。
構文:
EXPLAIN [AST | SYNTAX | QUERY TREE | PLAN | PIPELINE | ESTIMATE | TABLE OVERRIDE] [setting = value, ...]
[
SELECT ... |
tableFunction(...) [COLUMNS (...)] [ORDER BY ...] [PARTITION BY ...] [PRIMARY KEY] [SAMPLE BY ...] [TTL ...]
]
[FORMAT ...]
例:
EXPLAIN SELECT sum(number) FROM numbers(10) UNION ALL SELECT sum(number) FROM numbers(10) ORDER BY sum(number) ASC FORMAT TSV;
Union
Expression (Projection)
Expression (Before ORDER BY and SELECT)
Aggregating
Expression (Before GROUP BY)
SettingQuotaAndLimits (Set limits and quota after reading from storage)
ReadFromStorage (SystemNumbers)
Expression (Projection)
MergingSorted (Merge sorted streams for ORDER BY)
MergeSorting (Merge sorted blocks for ORDER BY)
PartialSorting (Sort each block for ORDER BY)
Expression (Before ORDER BY and SELECT)
Aggregating
Expression (Before GROUP BY)
SettingQuotaAndLimits (Set limits and quota after reading from storage)
ReadFromStorage (SystemNumbers)
EXPLAIN タイプ
AST
— 抽象構文木。SYNTAX
— ASTレベルの最適化後のクエリテキスト。QUERY TREE
— クエリツリーの最適化後。PLAN
— クエリ実行計画。PIPELINE
— クエリ実行パイプライン。
EXPLAIN AST
クエリASTのダンプ。SELECT
以外のすべてのクエリタイプをサポート。
例:
EXPLAIN AST SELECT 1;
SelectWithUnionQuery (children 1)
ExpressionList (children 1)
SelectQuery (children 1)
ExpressionList (children 1)
Literal UInt64_1
EXPLAIN AST ALTER TABLE t1 DELETE WHERE date = today();
explain
AlterQuery t1 (children 1)
ExpressionList (children 1)
AlterCommand 27 (children 1)
Function equals (children 1)
ExpressionList (children 2)
Identifier date
Function today (children 1)
ExpressionList
EXPLAIN SYNTAX
構文最適化後のクエリを返します。
例:
EXPLAIN SYNTAX SELECT * FROM system.numbers AS a, system.numbers AS b, system.numbers AS c;
SELECT
`--a.number` AS `a.number`,
`--b.number` AS `b.number`,
number AS `c.number`
FROM
(
SELECT
number AS `--a.number`,
b.number AS `--b.number`
FROM system.numbers AS a
CROSS JOIN system.numbers AS b
) AS `--.s`
CROSS JOIN system.numbers AS c
EXPLAIN QUERY TREE
設定:
run_passes
— クエリツリーパスをすべて実行してからクエリツリーをダンプします。デフォルト:1
。dump_passes
— クエリツリーをダンプする前に使用したパス情報をダンプします。デフォルト:0
。passes
— 実行するパスの数を指定します。-1
に設定すると、すべてのパスが実行されます。デフォルト:-1
。
例:
EXPLAIN QUERY TREE SELECT id, value FROM test_table;
QUERY id: 0
PROJECTION COLUMNS
id UInt64
value String
PROJECTION
LIST id: 1, nodes: 2
COLUMN id: 2, column_name: id, result_type: UInt64, source_id: 3
COLUMN id: 4, column_name: value, result_type: String, source_id: 3
JOIN TREE
TABLE id: 3, table_name: default.test_table
EXPLAIN PLAN
クエリプランステップをダンプします。
設定:
header
— ステップの出力ヘッダをプリントします。デフォルト: 0。description
— ステップの説明をプリントします。デフォルト: 1。indexes
— 使用されるインデックスと、各インデックスが適用されたときのフィルタリングされたパーツおよびグラニュールの数を表示します。デフォルト: 0。 MergeTree テーブルでサポートされます。actions
— ステップアクションに関する詳細情報をプリントします。デフォルト: 0。json
— クエリプランステップを JSON 形式の行としてプリントします。デフォルト: 0。TSVRaw 形式を使用すると不要なエスケープを避けることができます。
例:
EXPLAIN SELECT sum(number) FROM numbers(10) GROUP BY number % 4;
Union
Expression (Projection)
Expression (Before ORDER BY and SELECT)
Aggregating
Expression (Before GROUP BY)
SettingQuotaAndLimits (Set limits and quota after reading from storage)
ReadFromStorage (SystemNumbers)
:::note
ステップおよびクエリコストの推定はサポートされていません。
:::
json = 1
のとき、クエリプランはJSON形式で表現されます。各ノードは常に Node Type
と Plans
というキーを持つDictionaryです。Node Type
はステップ名を持つ文字列です。Plans
は子ステップの説明を含む配列です。他のオプションのキーは、ノードタイプと設定に応じて追加されることがあります。
例:
EXPLAIN json = 1, description = 0 SELECT 1 UNION ALL SELECT 2 FORMAT TSVRaw;
[
{
"Plan": {
"Node Type": "Union",
"Plans": [
{
"Node Type": "Expression",
"Plans": [
{
"Node Type": "SettingQuotaAndLimits",
"Plans": [
{
"Node Type": "ReadFromStorage"
}
]
}
]
},
{
"Node Type": "Expression",
"Plans": [
{
"Node Type": "SettingQuotaAndLimits",
"Plans": [
{
"Node Type": "ReadFromStorage"
}
]
}
]
}
]
}
}
]
description
= 1 の場合、Description
キーがステップに追加されます:
{
"Node Type": "ReadFromStorage",
"Description": "SystemOne"
}
header
= 1 の場合、Header
キーがカラムの配列としてステップに追加されます。
例:
EXPLAIN json = 1, description = 0, header = 1 SELECT 1, 2 + dummy;
[
{
"Plan": {
"Node Type": "Expression",
"Header": [
{
"Name": "1",
"Type": "UInt8"
},
{
"Name": "plus(2, dummy)",
"Type": "UInt16"
}
],
"Plans": [
{
"Node Type": "SettingQuotaAndLimits",
"Header": [
{
"Name": "dummy",
"Type": "UInt8"
}
],
"Plans": [
{
"Node Type": "ReadFromStorage",
"Header": [
{
"Name": "dummy",
"Type": "UInt8"
}
]
}
]
}
]
}
}
]
indexes
= 1 の場合、Indexes
キーが追加されます。使用されるインデックスの配列が含まれます。各インデックスは Type
キー (文字列 MinMax
、Partition
、PrimaryKey
、または Skip
) とオプションのキーを持つJSONで記述されます:
Name
— インデックス名 (Skip
インデックスでのみ使用されます)。Keys
— インデックスに使用されるカラムの配列。Condition
— 使用される条件。Description
— インデックスの説明 (Skip
インデックスでのみ使用されます)。Parts
— インデックス適用前/後のパーツ数。Granules
— インデックス適用前/後のグラニュール数。
例:
"Node Type": "ReadFromMergeTree",
"Indexes": [
{
"Type": "MinMax",
"Keys": ["y"],
"Condition": "(y in [1, +inf))",
"Parts": 5/4,
"Granules": 12/11
},
{
"Type": "Partition",
"Keys": ["y", "bitAnd(z, 3)"],
"Condition": "and((bitAnd(z, 3) not in [1, 1]), and((y in [1, +inf)), (bitAnd(z, 3) not in [1, 1])))",
"Parts": 4/3,
"Granules": 11/10
},
{
"Type": "PrimaryKey",
"Keys": ["x", "y"],
"Condition": "and((x in [11, +inf)), (y in [1, +inf)))",
"Parts": 3/2,
"Granules": 10/6
},
{
"Type": "Skip",
"Name": "t_minmax",
"Description": "minmax GRANULARITY 2",
"Parts": 2/1,
"Granules": 6/2
},
{
"Type": "Skip",
"Name": "t_set",
"Description": "set GRANULARITY 2",
"": 1/1,
"Granules": 2/1
}
]
actions
= 1 の場合、追加されるキーはステップのタイプによります。
例:
EXPLAIN json = 1, actions = 1, description = 0 SELECT 1 FORMAT TSVRaw;
[
{
"Plan": {
"Node Type": "Expression",
"Expression": {
"Inputs": [],
"Actions": [
{
"Node Type": "Column",
"Result Type": "UInt8",
"Result Type": "Column",
"Column": "Const(UInt8)",
"Arguments": [],
"Removed Arguments": [],
"Result": 0
}
],
"Outputs": [
{
"Name": "1",
"Type": "UInt8"
}
],
"Positions": [0],
"Project Input": true
},
"Plans": [
{
"Node Type": "SettingQuotaAndLimits",
"Plans": [
{
"Node Type": "ReadFromStorage"
}
]
}
]
}
}
]
EXPLAIN PIPELINE
設定:
header
— 各出力ポートのヘッダーをプリントします。デフォルト: 0。graph
— DOT グラフ記述言語で記述されたグラフをプリントします。デフォルト: 0。compact
—graph
設定が有効な場合にコンパクトモードでグラフをプリントします。デフォルト: 1。
例:
EXPLAIN PIPELINE SELECT sum(number) FROM numbers_mt(100000) GROUP BY number % 4;
(Union)
(Expression)
ExpressionTransform
(Expression)
ExpressionTransform
(Aggregating)
Resize 2 → 1
AggregatingTransform × 2
(Expression)
ExpressionTransform × 2
(SettingQuotaAndLimits)
(ReadFromStorage)
NumbersRange × 2 0 → 1
EXPLAIN ESTIMATE
クエリを処理する際に、テーブルから読み取る行、マーク、およびパーツの推定数を表示します。MergeTree ファミリーのテーブルで動作します。
例
テーブルを作成:
CREATE TABLE ttt (i Int64) ENGINE = MergeTree() ORDER BY i SETTINGS index_granularity = 16, write_final_mark = 0;
INSERT INTO ttt SELECT number FROM numbers(128);
OPTIMIZE TABLE ttt;
クエリ:
EXPLAIN ESTIMATE SELECT * FROM ttt;
結果:
┌─database─┬─table─┬─parts─┬─rows─┬─marks─┐
│ default │ ttt │ 1 │ 128 │ 8 │
└──────────┴───────┴───────┴──────┴───────┘
EXPLAIN TABLE OVERRIDE
テーブル関数を介してアクセスされるテーブルスキーマに対するテーブルオーバーライドの結果を表示します。また、オーバーライドが何らかの失敗を引き起こす場合に例外をスローして、いくつかの検証を行います。
例
リモートMySQLテーブルが以下のようにあるとします:
CREATE TABLE db.tbl (
id INT PRIMARY KEY,
created DATETIME DEFAULT now()
)
EXPLAIN TABLE OVERRIDE mysql('127.0.0.1:3306', 'db', 'tbl', 'root', 'clickhouse')
PARTITION BY toYYYYMM(assumeNotNull(created))
結果:
┌─explain─────────────────────────────────────────────────┐
│ PARTITION BY uses columns: `created` Nullable(DateTime) │
└─────────────────────────────────────────────────────────┘
:::note
検証は完全ではないため、成功したクエリであってもオーバーライドが問題を引き起こさないことを保証するわけではありません。
:::