概要
この記事では、DB2のSQL実行計画(Explain)を取得し、パフォーマンス改善のための評価方法を解説します。
実行計画とは、データベースがSQLクエリを実行する際にどのようなアクセスパスでデータを取得するかの経路、例えるならばデータベースのデータに到達するための道筋のようなイメージです。
道筋はSQL実行時データベースが判断し最短の道筋を判断したらSQLは早くなりますし、遠回りする道筋を判断してしまったら遅くなります。
実行計画を分析することで、SQLのパフォーマンスを最適化し、データベースの処理速度を向上させることが可能です。
準備作業
DB2でSQL実行計画を取得するためには、まずEXPLAIN表を作成する必要があります。EXPLAIN表は、接続しているスキーマに作成され、SYSTOOLSPACE 表スペースに保存されます。
なお、Explain表の作成方法はDB2のバージョンによって異なります。V9.5 以降のバージョンを使っていれば本記事の手順で大丈夫です。
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をされる方は覚えておくといいでしょう。