Db2でアクセスプランを確認する必要があったため、実施した手順を記録する。
まず、1回のみ実施する前処理として、以下のコマンドを実行する。
$ db2 connect to DB名
$ db2 -tvf ~/sqllib//misc/EXPLAIN.DDL
$ db2 connect reset
そして、以下のURLの資料に参考して、以下の手順でアクセスプランの取得が可能である。
$ db2 connect to DB名
$ db2 "set current explain mode explain"
あるいは
$ db2 "set current explain mode no"
$ db2exfmt -1 -d DB名 -o 出力ファイル名
試しにSAMPLE DBで実行してみた。
$ db2 connect to SAMPLE
$ db2 "set current explain mode explain"
$ db2 "SELECT t1.* FROM employee as t1 INNER JOIN department as t2 ON t1.workdept=t2.deptno WHERE t2.deptname like 'BRANCH%'"
$ db2 "set current explain mode no"
$ db2exfmt -1 -d SAMPLE -o output.txt
作成されたoutput.txtから以下のアクセスプランが見られる。
-----------
Total Cost: 143.581
Query Degree: 1
Rows
RETURN
( 1)
Cost
I/O
|
100
^HSJOIN
( 2)
143.581
21
/-----+------\
1000 100
TBSCAN TBSCAN
( 3) ( 4)
81.9241 61.6304
12 9
| |
1000 1000
TABLE: USER TABLE: USER
EMPLOYEE DEPARTMENT
Q2 Q1
TBSCANの文字ではテーブルスキャンが発生している意味である。
ちなみに、IDを使用するように以下のSQLを実行したアクセスプランも確認してみた。
SQL:
SELECT * FROM employee WHERE empno='000010'
アクセスプラン:
Access Plan:
-----------
Total Cost: 13.6198
Query Degree: 1
Rows
RETURN
( 1)
Cost
I/O
|
1
FETCH
( 2)
13.6198
2
/---+----\
1 1000
IXSCAN TABLE: USER
( 3) EMPLOYEE
6.81278 Q1
1 |
1000
INDEX: USER
PK_EMPLOYEE
Q1
INDEXを使用していることが確認できる。