Db2でSQLのアクセスプランを確認する

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 "何かのSQL"

あるいは

$ db2 -tvf sqlファイル

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から以下のアクセスプランが見られる。

Access Plan:Access Plan:

-----------

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を使用していることが確認できる。