トップ 差分 一覧 ping ソース 検索 ヘルプ PDF RSS ログイン

DB2 EXPLAIN の実行



目次



記事一覧

キーワード

DB2 EXPLAIN の実行

[DB2][Database][DBパフォーマンス]

 EXPLAIN

  • Explain 可能ステートメント のアクセスパス選択情報を入手
  • Explain 可能ステートメントとは、SELECT または INSERT ステートメント、または検索形式の UPDATE または DELETE ステートメント

呼び出し

  • 事前にプラン表を作成しておく
  • 以下の呼び出しで、explainable-sql-statement の分析結果がプラン表に格納される
例1
EXPLAIN PLAN FOR explainable-sql-statement
例2
EXPLAIN PLAN SET  QUERYNO=integer FOR explainable-sql-statement

 プラン表の作成


【V9.1 の作成方法】

Unix/Linux 環境では $INSTHOME/sqllib/misc/EXPLAIN.DDL に、Windows 環境では %DB2PATH%\MISC\EXPLAIN.DDL に EXPLAIN 表の DDL が保管されています。
DDL では表のスキーマ名や表スペースは指定されていないため、表は CURRENT SCHEMA のスキーマ名で、ユーザーに USE 特権が付与されている表スペース内に作成されます。
以下のように DDL を実行してください。

  • [Unix/Linux 環境の場合]
$ db2 connect to [データベース名] 
$ db2 -tf ~/sqllib/misc/EXPLAIN.DDL 
> db2 connect to [データベース名] 
> db2 -tf "%DB2PATH%\MISC\EXPLAIN.DDL" 

【V9.1 の削除方法】

EXPLAIN.DDL の中で CREATE されているオブジェクトを確認し DROP してください。
オブジェクトの中には依存関係が設定されているものがあるため、CREATE の時と逆の順番で削除してください。

【V9.5 以降の作成方法】

V9.5 以降では上記の EXPLAIN.DDL を利用する以外に、SYSINSTALLOBJECTS プロシージャーを利用して EXPLAIN 表を作成することもできます。
プロシージャーの第 3 引数は表を作成する表スペース名を、第 4 引数には表のスキーマ名を指定してください。
それぞれ NULL もしくは空文字の場合、SYSTOOLSPACE 表スペースに SYSTOOLS スキーマで作成されます。
SYSTOOLSPACE 表スペースがまだ存在しない場合、自動で作成されます。

以下の実行例では、SYSTOOLSPACE 表スペースに、接続ユーザー名のスキーマで Explain 表を作成します。

$ db2 connect to [データベース名] 
$ db2 "call SYSPROC.SYSINSTALLOBJECTS( 'EXPLAIN', 'C' , '', CURRENT USER )" 

【V9.5 以降の削除方法】

SYSINSTALLOBJECTS プロシージャーを利用して、Explain 表を削除できます。
第 4 引数には DROP する表のスキーマ名を指定してください。
NULL もしくは空文字の場合、SYSTOOLS スキーマの表が削除されます。

以下の実行例では、接続ユーザー名のスキーマの Explain 表を削除します。

$ db2 connect to [データベース名] 
$ db2 "call SYSPROC.SYSINSTALLOBJECTS( 'EXPLAIN', 'D', '', CURRENT USER )"

以下の SQL ステートメントを実行


CREATE TABLE userid.PLAN_TABLE
   (QUERYNO            INTEGER       NOT NULL,
    QBLOCKNO           SMALLINT      NOT NULL,
    APPLNAME           CHAR(8)       NOT NULL,
    PROGNAME           CHAR(8)       NOT NULL,
    PLANNO             SMALLINT      NOT NULL,
    METHOD             SMALLINT      NOT NULL,
    CREATOR            CHAR(8)       NOT NULL,
    TNAME              CHAR(18)      NOT NULL,
    TABNO              SMALLINT      NOT NULL,
    ACCESSTYPE         CHAR(2)       NOT NULL,
    MATCHCOLS          SMALLINT      NOT NULL,
    ACCESSCREATOR      CHAR(8)       NOT NULL,
    ACCESSNAME         CHAR(18)      NOT NULL,
    INDEXONLY          CHAR(1)       NOT NULL,
    SORTN_UNIQ         CHAR(1)       NOT NULL,
    SORTN_JOIN         CHAR(1)       NOT NULL,
    SORTN_ORDERBY      CHAR(1)       NOT NULL,
    SORTN_GROUPBY      CHAR(1)       NOT NULL,
    SORTC_UNIQ         CHAR(1)       NOT NULL,
    SORTC_JOIN         CHAR(1)       NOT NULL,
    SORTC_ORDERBY      CHAR(1)       NOT NULL,
    SORTC_GROUPBY      CHAR(1)       NOT NULL,
    TSLOCKMODE         CHAR(3)       NOT NULL,
    TIMESTAMP          CHAR(16)      NOT NULL,
    REMARKS            VARCHAR(254)  NOT NULL,
    PREFETCH           CHAR(1)       NOT NULL WITH DEFAULT,
    COLUMN_FN_EVAL     CHAR(1)       NOT NULL WITH DEFAULT,
    MIXOPSEQ           SMALLINT      NOT NULL WITH DEFAULT,
    VERSION            VARCHAR(64)   NOT NULL WITH DEFAULT,
    COLLID             CHAR(18)      NOT NULL WITH DEFAULT,
    ACCESS_DEGREE      SMALLINT      ,   
    ACCESS_PGROUP_ID   SMALLINT      ,
    JOIN_DEGREE        SMALLINT      ,
    JOIN_PGROUP_ID     SMALLINT      ,
    SORTC_PGROUP_ID    SMALLINT      ,
    SORTN_PGROUP_ID    SMALLINT      ,
    PARALLELISM_MODE   CHAR(1)       ,
    MERGE_JOIN_COLS    SMALLINT      ,
    CORRELATION_NAME   CHAR(18)      ,
    PAGE_RANGE         CHAR(1)       NOT NULL WITH DEFAULT,
    JOIN_TYPE          CHAR(1)       NOT NULL WITH DEFAULT,
    GROUP_MEMBER       CHAR(8)       NOT NULL WITH DEFAULT,
    IBM_SERVICE_DATA   VARCHAR(254)  NOT NULL WITH DEFAULT,
    WHEN_OPTIMIZE      CHAR(1)       NOT NULL WITH DEFAULT,
    QBLOCK_TYPE        CHAR(6)       NOT NULL WITH DEFAULT,
    BIND_TIME          TIMESTAMP     NOT NULL WITH DEFAULT,
    OPTHINT            CHAR(8)       NOT NULL WITH DEFAULT,
    HINT_USED          CHAR(8)       NOT NULL WITH DEFAULT,
    PRIMARY_ACCESSTYPE CHAR(1)       NOT NULL WITH DEFAULT,
    PARENT_QBLOCKNO    SMALLINT      NOT NULL WITH DEFAULT,
    TABLE_TYPE         CHAR(1)       )
IN database-name.table-space-name;

database-name.able-space-name は、使用許可を持つデータベースおよび表スペースを示しています。


 列に格納される値の意味

内容
QUERYNO ステートメントを識別する番号
QBLOCKNO ステートメント内の照会の位置 (最外部の照会は 1、次の照会は 2、以下同様)
APPLNAME アプリケーション・プランの名前
PROGNAME ステートメントを含むプログラムまたはパッケージの名前
PLANNO QBLOCKNO で示された照会が処理されたステップの番号
METHOD ※ 下表参照
CREATOR 表の作成者
TNAME 表、一時表、View、表式の名前
TABNO IBM のみが使用
ACCESSTYPE ※ 下表参照
MATCHCOLS 索引走査で使われる索引キーの数
ACCESSCREATOR 索引の作成者
ACCESSNAME 索引の名前
INDEXONLY ステップを実行するのに索引のアクセスだけで間に合うのか
SORTN_UNIQ 重複行を取り除くため、新しい表でソートを行うのか
SORTN_JOIN 結合方式が 2 または 4 の場合に、新しい表でソートを行うのか
SORTN_ORDERBY ORDER BY の場合、新しい表でソートを行うのか
SORTN_GROUPBY GROUP BY の場合、新しい表でソートを行うのか
SORTC_UNIQ 重複行を取り除くため、複合表でソートを行うのか
SORTC_JOIN 結合方式が 1、2、または 4 の場合に、複合表でソートを行うのか
SORTC_ORDERBY ORDER BY 文節または比較述部の場合、複合表でソートを行うのか
SORTC_GROUPBY GROUP BY 文節の場合に、複合表でソートを行うのか
TSLOCKMODE 必要とされるロックのモードの指示 ※ 下表参照
TIMESTAMP 通常は、行が処理される時刻
REMARKS 文字ストリングを挿入できるフィールド。
PREFETCH 事前取り出しによりデータ・ページを前もって読み取るのかどうか。 S = 純粋な順次事前取り出し。 L = ページ・リストを介しての事前取り出し。ブランク = 不明あるいは事前取り出しなし
COLUMN_FN_EVAL SQL 列関数がいつ評価されるのか。 R = 表または索引からのデータの読み取り時。S = GROUP BY 文節を満たすためのソート実行時。ブランク = データ検索後およびソート後
MIXOPSEQ 複数索引の操作でのステップの順序番号。複数索引プロシージャーのステップの場合 (ACCESSTYPE はMX、MI、または MU)0 その他の行の場合 (ACCESSTYPE は I、I1、M、N、R、またはブランク)
VERSION パッケージのバージョン ID
COLLID パッケージの収集 ID
ACCESS_DEGREE 照会によってアクティブ化される並列タスクまたは操作の数
ACCESS_PGROUP_ID 新しい表をアクセスするための並列グループの ID
JOIN_DEGREE 複合表を新しい表と結合するのに使用される並列操作またはタスクの数
JOIN_PGROUP_ID 複合表を新しい表と結合するための並列グループのID
SORTC_PGROUP_ID 複合表の並列ソートのための並列グループ ID
SORTN_PGROUP_ID 新しい表の並列ソートのための並列グループ ID
PARALLELISM_MODE バインド時に使用される並列処理の種類。I 照会入出力並列処理 C 照会 CP 並列処理 X シスプレックス照会並列処理
MERGE_JOIN_COLS マージ走査結合時に結合される列の数
CORRELATION_NAME ステートメントで指定された表または視点の相関名
PAGE_RANGE ページ範囲のスクリーニングのために表を修飾し、プランが必要な区画のみを走査するようにするかどうか
JOIN_TYPE ※ 下表参照
GROUP_MEMBER DB2のメンバー名
WHEN_OPTIMIZE アクセス・パスが決定されるとき ※ 下表参照
QBLOCK_TYPE 各照会ブロックについて、実行する SQL 操作のタイプの指示
BIND_TIME バインドされた時刻
OPTHINT 最適化ヒントとして指定する際に使用するストリング。 DB2 は、アクセス・パスを選択するときに、入力データとしてこの行を使用
HINT_USED ヒントのID
PRIMARY_ACCESSTYPE 直接行アクセスが最初にアクセスされるかどうかを指示 D=使用しようとする、ブランク=使用しようとしない
PARENT_QBLOCKNO 親照会ブロックの QBLOCKNO を示す
TABLE_TYPE 新しい表のタイプ ※ 下表参照

METHOD
意味
0 アクセスされた最初の表、前にアクセスされた表の続き、または未使用。
1 ネストされたループ 結合。 現在の複合表の各行ごとに、新しい表から一致する行を探して結合。
2 マージ走査 結合。 現在の複合表と新しい表を結合列の順序で走査し、一致する行を結合。
3 ORDER BY、GROUP BY、 SELECT DISTINCT、UNION、比較述部、または IN 述部で必要なソートを行う。新しい表をアクセスしません。
4 ハイブリッド 結合。 現在の複合表を、新しい表の結合列の行の順序で走査。 新しい表は、リスト事前取り出しを使ってアクセス。

ACCESSTYPE
  • 新しい表をアクセスする方法:

意味
I 索引 (ACCESSCREATOR および ACCESSNAME で指定される) による方法。
I1 1 個の取り出し索引走査による方法。
N 一致する述部に IN キーワードが含まれている場合の索引走査による方法。
R 表スペース走査による方法。
M 複数索引の走査による方法。(MX、MI、または MU が後に続きます。)
MX ACCESSNAME で指定される索引を使った索引走査による方法。
MI 複数索引の交差による方法。
MU 複数索引の組み合わせによる方法。
T 疎索引による方法 (星型結合作業ファイル)
ブランク 現在行には該当しない。

TSLOCKMODE
  • バインド実行時に分離を決定できる
意味
IS 意図共用ロック
IX 意図排他ロック
S 共用ロック
U 更新ロック
X 排他ロック
SIX 意図排他ロックによる共用
N UR 分離、ロックなし
  • バインド実行時に分離を決定できない
意味
NS UR 分離の場合、ロックなし。CS、RS、または RR の場合、S ロック。
NIS UR 分離の場合、ロックなし。CS、RS、または RR の場合、IS ロック。
NSS UR 分離の場合、ロックなし。CS または RS の場合、IS ロック。 RR の場合、S ロック。
SS UR、CS、または RS 分離の場合、IS ロック。RR の場合、S ロック。

JOIN_TYPE
意味
F FULL OUTER JOIN
L LEFT OUTER JOIN
S STAR JOIN
ブランク INNER JOIN または結合なし

RIGHT OUTER JOIN は、使用時に LEFT OUTER JOIN へ変換される


WHEN_OPTIMIZE
内容
ブランク バインド時
B バインド時。ただし、ステートメントは実行時に、再度最適化
R 実行時

TABLE_TYPE
内容
F 表関数
Q 一時中間結果表
T
W 作業ファイル



YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto

Copyright© 矢木 浩人 All Rights Reserved.