EXPLAINコマンド
EXPLAINコマンドを使用したSQL実行計画の確認方法をご紹介します。
実行計画の情報から、有効なプロジェクションを使用しているか確認することができます。
なお、EXPLAINを付与してSQLを実行した場合は、実行計画を取得するのみで、実際にはSQLは実行されません。
また、Management Consoleからも実行計画の確認は行えます。
参考情報に記事を案内いたしますので、良ければそちらもご確認ください。
構文
データベースへログインし、確認対象SQLの前に「EXPLAIN」を付与して実行します。
dbadmin=> EXPLAIN 確認対象SQL文;実行例
dbadmin=> EXPLAIN
dbadmin-> SELECT c_nation
dbadmin-> FROM ssbm.customer, ssbm.lineorder
dbadmin-> WHERE lo_custkey = c_custkey
dbadmin-> AND c_region = 'AMERICA'
dbadmin-> ORDER BY c_nation;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------
QUERY PLAN DESCRIPTION:
------------------------------
EXPLAIN
SELECT c_nation
FROM ssbm.customer, ssbm.lineorder
WHERE lo_custkey = c_custkey
AND c_region = 'AMERICA'
ORDER BY c_nation;
Access Path:
+-SORT [Cost: 136K, Rows: 3M] (PATH ID: 1)
| Order: customer.c_nation ASC
| +---> JOIN HASH [Cost: 91K, Rows: 3M] (PATH ID: 2)
| | Join Cond: (lineorder.lo_custkey = customer.c_custkey)
| | +-- Outer -> STORAGE ACCESS for lineorder [Cost: 47K, Rows: 10M] (PATH ID: 3)
| | | Projection: ssbm.lineorder_super
| | | Materialize: lineorder.lo_custkey
| | | Runtime Filter: (SIP1(HashJoin): lineorder.lo_custkey)
| | +-- Inner -> STORAGE ACCESS for customer [Cost: 33K, Rows: 900K] (PATH ID: 4)
| | | Projection: ssbm.customer_super
| | | Materialize: customer.c_custkey, customer.c_nation
| | | Filter: (customer.c_region = 'AMERICA')
------------------------------
-----------------------------------------------
PLAN: BASE QUERY PLAN (GraphViz Format)
-----------------------------------------------
digraph G {
graph [rankdir=BT, label = "BASE QUERY PLAN\nQuery: EXPLAIN\nSELECT c_nation\nFROM ssbm.customer, ssbm.lineorder\nWHERE lo_custkey = c_custkey\n AND c_region = \'AMERICA\'\nORDER BY c_nation;\n\nAll Nodes Vector: \n\n node[0]=v_moeda_node0001 (initiator) Up\n", labelloc=t, labeljust=l ordering=out]
0[label = "Root \nOutBlk=[UncTuple]", color = "green", shape = "house"];
1[label = "NewEENode \nOutBlk=[UncTuple]", color = "green", shape = "box"];
2[label = "ExprEval: \n customer.c_nation\nUnc: Char(15)", color = "green", shape = "box"];
3[label = "Sort: (keys = A,N)\nUnc: Char(15)\nUnc: Numeric(37,15)", color = "green", shape = "box"];
4[label = "StorageUnionStep: lineorder_super\nUnc: Char(15)\nUnc: Numeric(37,15)", color = "purple", shape = "box"];
5[label = "Join: Hash-Join: \n(ssbm.lineorder x ssbm.customer) using lineorder_super and customer_super (PATH ID: 2)\n\nUnc: Char(15)\nUnc: Numeric(37,15)", color = "brown", shape = "box"];
6[label = "ScanStep: lineorder_super\nSIP1(HashJoin): lineorder.lo_custkey\nlo_orderkey (not emitted)\nlo_custkey\nUnc: Numeric(37,15)", color = "brown", shape = "box"];
7[label = "StorageUnionStep: customer_super\nUnc: Numeric(37,15)\nUnc: Char(15)", color = "purple", shape = "box"];
8[label = "ScanStep: customer_super\n(customer.c_region = \'AMERICA\')\nc_custkey\nc_nation\nc_region (not emitted)\nUnc: Numeric(37,15)\nUnc: Char(15)", color = "brown", shape = "box"];
1->0 [label = "V[0]",color = "black"];
2->1 [label = "0",color = "blue"];
3->2 [label = "0",color = "blue"];
4->3 [label = "0",color = "blue"];
5->4 [label = "0",color = "blue"];
6->5 [label = "0",color = "blue"];
7->5 [label = "1",color = "blue"];
8->7 [label = "0",color = "blue"];
}
(50 rows)実行計画の出力形式
実行計画は下記2種類の形式で出力されます。
本記事では、QUERY PLAN DESCRIPTIONをご紹介します。
・ QUERY PLAN DESCRIPTION
実行計画を処理ステップごとに階層表示した出力形式です。
・ BASE QUERY PLAN (GraphViz Format)
Graphvizというツール用の出力形式です。
実行計画内の語句
代表的な語句の意味をご紹介します。
語句 | 意味 |
|---|---|
Projection | クエリ実行時にオプティマイザが選択したプロジェクション |
Filter | データセットに適用されるフィルター(WHERE句の条件値) |
STORAGE ACCESS for テーブル名 | テーブルへのデータアクセス処理 |
JOIN HASH | ハッシュ結合処理 |
Outer | 結合処理の外部表(結合演算子の左側) |
Inner | 結合処理の内部表(結合演算子の右側) |
SORT | ソート処理 |
実行計画の読み方
実行計画は各処理を階層構造で出力します。
一般的に、「PATH ID」が大きい処理から先に実行されたものとして読み取ります。
通常は階層の深い処理ほどPATH IDが大きくなります。
※各処理は並列実行されるため、実際の処理順序とは異なります。
上述の実行例の場合は、以下のように読み取ります。
1. customer表にアクセス (PATH ID:4)
2. lineorder表にアクセス (PATH ID:3)
3. lineorder表にアクセスしたデータセットを外部表、customer表にアクセスしたデータセットを内部表とし、ハッシュ結合を実行 (PATH ID:2)
4. ハッシュ結合されたデータセットをソート (PATH ID:1)
各処理ステップにはCost(コスト)とRows(行数)が出力されます。
この情報を基にチューニングすべき処理ステップを絞り、チューニング作業を行います。
参考情報
Management Consoleを利用したモニタリング~クエリ解析編~
https://www.ashisuto.co.jp/cm/analytics-database/beginner_vertica_6.html
検証バージョンについて
この記事の内容はVertica 9.1で確認しています。