DB2

[DB2] SQL実行計画の取得と評価方法【DB2 EXPLAINの使い方】

概要

この記事では、DB2のSQL実行計画(Explain)を取得し、パフォーマンス改善のための評価方法を解説します。

実行計画とは、データベースがSQLクエリを実行する際にどのようなアクセスパスでデータを取得するかの経路、例えるならばデータベースのデータに到達するための道筋のようなイメージです。
道筋はSQL実行時データベースが判断し最短の道筋を判断したらSQLは早くなりますし、遠回りする道筋を判断してしまったら遅くなります。

実行計画を分析することで、SQLのパフォーマンスを最適化し、データベースの処理速度を向上させることが可能です。

準備作業

DB2でSQL実行計画を取得するためには、まずEXPLAIN表を作成する必要があります。EXPLAIN表は、接続しているスキーマに作成され、SYSTOOLSPACE 表スペースに保存されます。
なお、Explain表の作成方法はDB2のバージョンによって異なります。V9.5 以降のバージョンを使っていれば本記事の手順で大丈夫です。

[Db2] Explain 表の作成方法と削除方法

EXPLAIN表の作成方法

次の手順でEXPLAIN表を作成します:

$ db2 connect to sample user db2inst1 using [password]
$ db2 "call SYSPROC.SYSINSTALLOBJECTS( 'EXPLAIN', 'C' , '', CURRENT USER )"

  リターン状況 = 0
$ 

作成確認

$ db2 list tables| grep -e ADVISE_ -e EXPLAIN_ -e OBJECT_METRICS
ADVISE_INDEX             DB2INST1   T     2024-08-22-02.28.37.643666
ADVISE_INSTANCE          DB2INST1   T     2024-08-22-02.28.37.374133
ADVISE_MQT               DB2INST1   T     2024-08-22-02.28.37.979123
ADVISE_PARTITION         DB2INST1   T     2024-08-22-02.28.38.198564
ADVISE_TABLE             DB2INST1   T     2024-08-22-02.28.38.490314
ADVISE_WORKLOAD          DB2INST1   T     2024-08-22-02.28.37.802803
EXPLAIN_ACTUALS          DB2INST1   T     2024-08-22-02.28.40.566664
EXPLAIN_ARGUMENT         DB2INST1   T     2024-08-22-02.28.35.048939
EXPLAIN_DIAGNOSTIC       DB2INST1   T     2024-08-22-02.28.36.626793
EXPLAIN_DIAGNOSTIC_DATA  DB2INST1   T     2024-08-22-02.28.36.964599
EXPLAIN_INSTANCE         DB2INST1   T     2024-08-22-02.28.34.521513
EXPLAIN_OBJECT           DB2INST1   T     2024-08-22-02.28.35.529468
EXPLAIN_OPERATOR         DB2INST1   T     2024-08-22-02.28.35.759416
EXPLAIN_PREDICATE        DB2INST1   T     2024-08-22-02.28.36.093091
EXPLAIN_STATEMENT        DB2INST1   T     2024-08-22-02.28.34.778254
EXPLAIN_STREAM           DB2INST1   T     2024-08-22-02.28.36.344579
OBJECT_METRICS           DB2INST1   T     2024-08-22-02.28.37.180947

EXPLAIN表の削除方法

$ db2 "call SYSPROC.SYSINSTALLOBJECTS( 'EXPLAIN', 'D', '', CURRENT USER )"

  リターン状況 = 0
$ 

実行計画 (Explain) の取得方法

SQL実行計画を取得するためには、以下の2つのステップを行います。

ステップ1: 実行計画のExplain表への挿入

解析したいSQLの前にEXPLAIN PLAN FORを付けて実行します。これにより、SQLの実行計画がExplain表に挿入されます。
explain plan for を付けて実行すると解析だけ行われ、実際にSQLが実行されるわけではありません。

$ db2 "explain plan for select * from ORG"
DB20000I  SQL コマンドが正常に完了しました。

ステップ2: Explain表のデータをファイルに出力

Explain表に挿入された情報をファイルに出力します。以下のコマンドを使用します:

db2exfmt -d [DB名] -1 -o [出力ファイル名]
$ db2exfmt -d sample -1 -o db2exfmt.out
DB2 Universal Database Version 11.5, 5622-044 (c) Copyright IBM Corp. 1991, 2017
Licensed Material - Program Property of IBM
IBM DATABASE 2 Explain Table Format Tool

Connecting to the Database.
Connect to Database Successful.
Output is in db2exfmt_3.out.
Executing Connect Reset -- Connect Reset was Successful.
$ 

実行計画を開く

解析結果は、指定したファイル名でカレントディレクトリにテキスト形式で出力されます:

$ cat db2exfmt.out

評価ポイント

解析結果に多くの情報が含まれていますが、まずは次のポイントに注目すると良いでしょう。

1.Access Planの確認

SQLのアクセスパスが正しく設定されているか確認します。
特に、フルスキャンかインデックススキャンかを確認することが重要です。

フルスキャン (TBSCAN) の場合:

フルスキャンしている場合解析結果にTBSCANが含まれています。
フルスキャンが行われると、特に大きなテーブルではパフォーマンスが低下することが多いです。

Access Plan:
-----------
        Total Cost:             47.7444
        Query Degree:           1

      Rows
     RETURN
     (   1)
      Cost
       I/O
       |
      1000
     TBSCAN
     (   2)
     47.7444
        7
       |
      1000
 TABLE: DB2INST1
       ORG
       Q1
インデックススキャン (IXSCAN) の場合:

インデックススキャンしている場合解析結果にIXSCANが含まれています。
インデックススキャンを使用することで、効率的にデータにアクセスできます。もしインデックスが使用されていない場合は、RUNSTATSの実行やインデックスの作成を検討するとよいでしょう。

Access Plan:
-----------
        Total Cost:             6.81064
        Query Degree:           1

             Rows
            RETURN
            (   1)
             Cost
              I/O
              |
             5.56
            FETCH
            (   2)
            6.81064
               1
         /----+----\
      5.56           139
     IXSCAN    TABLE: DB2INST1
     (   3)          ORG
   0.00451944        Q1
        0
       |
       139
   INDEX: DB2INST1
   IDX_DEPTNUM
       Q1

2.Total Costの確認

複数の環境で比較する場合、Total Costを用いてクエリのパフォーマンスを比較することができます。Total Costが高いほど、クエリの実行にコストがかかることを意味します。

まとめ

実行計画を解析することはすべてのデータベースで共通しています。
OracleでもEXPLAIN PLANを使用した実行計画の解析を行います。

最適なアクセスパスを選択することで、SQLクエリのパフォーマンスを大幅に改善することができますのでDBAをされる方は覚えておくといいでしょう。