!!!DB2 EXPLAIN の実行 [DB2][Database]{{category 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 !!プラン表の作成 *http://www-01.ibm.com/support/docview.wss?uid=swg21596631 !【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 *[Windows 環境の場合] > 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,作業ファイル