OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

SQLの実行計画を確認する方法

公開日:
更新日:
基本操作
#実行計画
#EXPLAIN

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で確認しています。