EXPLAIN ステートメント


プラン表 には、指定された 1 つ以上のステートメントのアクセス・パスに関する情報が含まれています。 ステートメント表 には、EXPLAIN 可能ステートメントの実行の見積コストに関する情報を追加できます。 関数表 には、EXPLAIN 可能ステートメントで参照されるユーザー定義関数を Db2 がどのように解決するかについての情報を取り込むことができます。 その他の EXPLAIN 表に、EXPLAIN 可能ステートメントの実行に関する情報を追加できます。 EXPLAINテーブルの一覧は、EXPLAINテーブルを参照してください。
システム・データのバージョン管理が使用可能に設定されているシステム期間テンポラル表を参照する照会で EXPLAIN を使用すると、照会を満たすためにシステム期間テンポラル表と履歴表の両方を照会で参照する必要がある場合、結果の EXPLAIN 出力にはシステム期間テンポラル表と履歴表が表示されます。
呼びかけ EXPLAIN
このステートメントは、アプリケーション・プログラムに組み込むか、あるいは対話式に発行することができます。 このステートメントは、動的に作成できる実行可能ステートメントです。
承認 EXPLAIN
許可規則は、EXPLAIN ステートメントで指定する SQL ステートメント に対して定義されている規則となります。 例えば、DELETE ステートメントの EXPLAIN レコードがキャプチャーされるときに適用される許可規則の場合は、DELETE ステートメントの解説を参照してください。
アプリケーション・プログラムに EXPLAIN ステートメントを組み込む 場合に適用される許可規則は、指定する SQL ステートメントを アプリケーション・プログラムに組み込む場合に対して定義されている規則です。 さらに、プランまたはパッケージ所有者には、次のいずれかの特性が必要です。
- PLAN_TABLE という名前のプラン表の所有者である
- owner.PLAN_TABLE という名前のプラン表上に別名を持っており、さらにその表に対する SELECT および INSERT 特権を持っている
EXPLAIN ステートメントを動的に準備する場合、適用される 許可規則は、指定した SQL ステートメントで動的に準備しようと しているものに定義された規則になります。 また、プロセスの SQL 許可 ID またはプロセスに関連付けられているロール (EXPLAIN ステートメントが ROLE AS OBJECT OWNER AND QUALIFIER 文節を指定するトラステッド・コンテキストで実行されている場合) には、次のいずれかの特性が必要です。
- PLAN_TABLE という名前のプラン表の作成者である
- creator.PLAN_TABLE という名前のプラン表上に別名を持っており、さらにその表に対する SELECT および INSERT 特権を持っている
- EXPLAIN
- SQLADM
- システム DBADM
- EXPLAIN ステートメントで指定する SQL ステートメントに対して定義される許可規則。 例えば、DELETE ステートメントの EXPLAIN レコードがキャプチャーされるときに適用される許可規則は、DELETE ステートメントに対する許可規則です。
FL 500 STMTCACHE または STABILIZED DYNAMIC QUERY キーワードが指定されている場合、承認ルールは異なります。 特権セットには、少なくとも次のいずれかが含まれていなければなりません。
- SQLADM 権限
- SYSADM 権限
- キャッシュ・ステートメントを共有するために必要な権限。 動的ステートメントキャッシュの使用権限に関する詳細は、「ステートメント共有の条件」 を参照してください。
- システム DBADM 権限
- SQLADM 権限
- システム DBADM 権限
- SYSADM 権限
特権セットに必要な権限がない場合は、特権セットと同じ許可 ID を持つステートメントのみの EXPLAIN レコードがキャプチャーされます。
- SQLADM 権限
- SYSADM 権限
- SYSOPR 権限
- SYSCTRL 権限
特権セット: 特権セットには、プロセスの許可 ID が所有する権限の和集合が含まれます。 ロールを持つトラステッド・コンテキスト内でプロセスを実行している場合、このロールは、そのプロセスの許可 ID として組み込まれます。
構文 EXPLAIN
パッケージスコープ仕様:
説明の対象: EXPLAIN
- PLAN
SQL ステートメントのアクセス・パス情報をキャプチャーすることを指定します。 このオプションでは、Db2 はアクセス・パス選択プロセスを使用して、ステートメントの EXPLAIN レコードを生成します。
explainable-sql-statement を実行するときに使用されるステップごとに、PLAN_TABLE に 1 つの行が挿入されます。 ただし、参照制約を適用するための手順は含まれません。ステートメント表が存在する場合、EXPLAIN 可能ステートメント処理の コスト見積もりを示す行が ステートメント表に挿入されます。 EXPLAIN 可能ステートメントが SELECT FROM data-change-statement の場合は、2 つの行がステートメント表に挿入されます。
関数表が存在する場合、EXPLAIN 可能ステートメントによって示される各ユーザー定義関数ごとに、 1 行が関数表に挿入されます。
追加の EXPLAIN 表が存在する場合は、行はそれらの表にも挿入されます。
詳しくは、以下を参照してください。- すべて
- PLAN と同じ働きをします。
- SET QUERYNO = integer
- integer を explainable-sql-statement に関連付けます。 QUERYNO 列には EXPLAIN ステートメントによってプラン表、ステートメント表、 または関数表に挿入される各行内の、integer の値が入ります。 QUERYNO が指定されていない場合は、Db2 自体が番号を割り当てます。 組み込み EXPLAIN ステートメントの場合、これはプリコンパイラーが 割り当てて DBRM に入れたステートメント番号となります。
- FOR explainable-sql-statement
- EXPLAIN レコードがキャプチャーされる SQL ステートメントのテキストを指定します。 explainable-sql-statement は、EXPLAIN 可能 SQL ステートメントであれば
どのようなものでも構いません。
SELECT、MERGE、TRUNCATE、INSERT文、またはUPDATEまたはDELETE文の検索フォームである場合、その文は説明可能である。
EXPLAIN文がプログラムに埋め込まれている場合、その文にはホスト変数への参照を含めることができます。 EXPLAIN を動的に準備する場合は、ステートメントにパラメーター・マーカーを 含めることができます。 ステートメントに含めるホスト変数は、そのステートメントのプログラム内で 定義しておかなければなりません。
ステートメントが参照するオブジェクトは、現行サーバーに存在していなければなりません。
explainable-sql-statement に決して QUERYNO 文節を含めないでください。 QUERYNO 列の値を指定するには、EXPLAIN ステートメントの SET QUERYNO = integer 文節を使用してください。
explainable-sql-statement を、ステートメント名または ホスト変数にすることはできません。 動的 SQL ステートメントの EXPLAIN レコードをキャプチャーするには、EXPLAIN ステートメント全体を動的に準備しなければなりません。
宣言済み一時表を参照する EXPLAIN 可能な SQL ステートメントに関する情報を得るには、表が宣言されたのと同じ アプリケーション・プロセスで EXPLAIN ステートメントを実行しなければなりません。 静的 EXPLAIN ステートメントの場合、この情報はバインド時ではなく、 EXPLAIN ステートメントが徐々にバインドされる実行時に得られます。
- STMTCACHE
- 動的ステートメント・キャッシュ内の指定された動的 SQL ステートメントの EXPLAIN レコードが EXPLAIN 表に抽出されて書き込まれることを指定します。 このオプションでは、新しいアクセス・パス選択の処理は行われません。 EXPLAIN レコードは、動的 SQL ステートメントが準備されてステートメント・キャッシュに入ったときに選択された既存のアクセス・パスから抽出されます。 データ共用環境では、EXPLAIN レコードは、EXPLAIN STMTCACHE ステートメントが実行されるデータ共用メンバーの動的ステートメント・キャッシュから抽出されます。
- すべて
- キャッシュされたすべてのステートメントの EXPLAIN レコードが抽出されることを指定します。 STMTCACHE ALL は、キャッ シュされた各ステートメントごとに 1 行を DSN_STATEMENT_CACHE_TABLE に戻します。 これらの行には、キャッシュ内のステートメントに関する識別情報と、そのステートメントを実行したすべてのプロセスによるステートメントの実行を反映する統計が含まれています。 STMTCACHE ALL が指定されている場合、レコードは他のEXPLAINテーブルには返されません。
- STMTID id-host-variable または integer-constant
- 指定されたステートメント ID を持つキャッシュ・ステートメントの EXPLAIN レコードが抽出されることを指定します。 id-host-variable に含まれる値、または integer-constant によって指定される値は、ステートメント ID を識別します。 STMTCACHE STMTID は、以下の EXPLAIN テーブルに行を返します。
- PLAN_TABLE
- DSN_STATEMNT_TABLE
- DSN_FUNCTION_TABLE
- DSN_STATEMENT_CACHE_TABLE
戻される EXPLAIN 表のレコードごとの QUERYNO 列には、ステートメント ID 値が含まれます。
- STMTTOKEN id-host-variable または string-constant
- 指定されたステートメント・トークンを持つキャッシュ・ステートメントの EXPLAIN レコードが抽出され、特定の EXPLAIN 表に書き込まれることを指定します。 token-host-variable に含まれる値、または string-constant によって指定される値は、ステートメント・トークンを識別します。 STMTCACHE STMTTOKENは、以下のEXPLAINテーブルにレコードを書き込みます。
- PLAN_TABLE
- DSN_STATEMNT_TABLE
- DSN_FUNCTION_TABLE
- DSN_STATEMENT_CACHE_TABLE
戻される PLAN_TABLE レコードごとの STMTTOKEN 列には、ステートメント・トークン値が含まれます。 戻される EXPLAIN 表のレコードごとの QUERYNO 列には、ステートメント ID 値が含まれます。
詳しくは、以下を参照してください。
- PACKAGE
- 指定された有効範囲と一致するパッケージ内のすべての静的 SQL ステートメントの EXPLAIN レコードが抽出され、EXPLAIN 表に書き込まれることを指定します。 このオプションでは、新しいアクセス・パス選択の処理は行われません。 レコードは、パッケージがバインドされたときに選択された既存のアクセス・パスから抽出されます。 EXPLAIN 情報は、現行ユーザーが所有する PLAN_TABLE に追加されます。 その他の EXPLAIN 表には値は追加されません。
- COLLECTION collection-name
- 指定された collection-name のステートメントのみの EXPLAIN レコードがキャプチャーされることを指定します。 collection-name は、コレクション名を表すストリング定数またはホスト変数です。
- パッケージ package-name
- 指定された package-name のステートメントのみの EXPLAIN レコードがキャプチャーされることを指定します。 package-name は、パッケージ名を表すストリング定数またはホスト変数です。
- VERSION バージョン名
指定された version-name のステートメントのみの EXPLAIN レコードがキャプチャーされることを指定します。 version-name は、バージョン名を表すストリング定数またはホスト変数です。 version-name がすべてブランクまたは空ストリングの場合、レコードは、バージョン名がすべてブランクであるパッケージのバージョンにのみキャプチャーされます。
VERSION 文節が指定されていない場合、EXPLAIN レコードは、パッケージ package-name のすべてのバージョンのステートメントにキャプチャーされます。
- COPY copy-id
- 指定された copy-id のステートメントのみの EXPLAIN レコードがキャプチャーされることを指定します。 copy-id は、以下のいずれかの値にしなければなりません。
- CURRENT
- PREVIOUS
- ORIGINAL
FL 500 COPY 句が指定されていない場合、そのパッケージに存在する現在のコピー、以前のコピー、および元のコピーのステートメントおよび EXPLAIN レコードがキャプチャされます。
PLAN_TABLE 内の HINT_USED 列にはEXPLAIN PACKAGE: copy-id
が追加されます。 HINT_USED 列の copy-id は、以下の値のいずれかになります。CURRENT
- 現行コピーPREVIOUS
- 前のコピーORIGINAL
- 元のコピー
STABILIZED DYNAMIC QUERY
FL 500 は、 STMTID キーワードによって識別される安定化された動的ステートメントの説明レコードが抽出され、次の EXPLAIN テーブルに書き込まれることを指定します。
- PLAN_TABLE
- DSN_STATEMNT_TABLE
- DSN_FUNCTION_TABLE
- STMTID id-host-variableまたはinteger-constant
- 指定されたステートメント ID を持つステートメントの EXPLAIN 情報がキャプチャーされることを指定します。 この値はEXPLAINテーブルの PER_STMT_ID列に挿入されます。
- COPY copy-id
- 指定されたコピー ID 値を持つステートメントのみの EXPLAIN 情報がキャプチャーされることを指定します。 copy-id はストリング定数で、以下のいずれかの値でなければなりません。
- CURRENT
- 無効
PLAN_TABLE.HINT_USED 列には、ストリング 'EXPLAIN SDQ: copy-id-number' が設定されます。ここで、copy-id-number は、以下のいずれかの値です。
- CURRENT
- 現行コピー。
- 無効
- 無効なコピー。
戻される EXPLAIN 表ごとの QUERYNO 列はデフォルト値 0 に設定され、COLLID 列の値は 'DSNSTBLQRYEXPLAIN' に設定されます。
注釈 EXPLAIN
- EXPLAIN からの出力:
- Db2 は、1 つ以上の行のデータをプラン表およびその他の既存の EXPLAIN 表 に挿入します。
EXPLAINテーブルの一覧については、「EXPLAINテーブル」 を参照してください。
結果として EXPLAIN 出力が得られる操作を実行する前に、プラン表が存在している必要があります。 各 EXPLAIN テーブルのサンプル CREATE TABLE ステートメントは、 プレフィックス. SDSNSAMP ライブラリのメンバー DSNTESC にあります。
追加の EXPLAIN 表で提供される情報を必要としない場合は、EXPLAIN を使用するためにそれらの表を作成する必要はありません。 ただし、EXPLAIN ステートメントの一部として STMTCACHE ALL キーワードが指定されている場合は、ステートメント・キャッシュ表が必要です。
Db2 は、以下の表に示すように、アクセス・パス選択プロセスを使用して、特定のタイプの EXPLAIN ステートメントに対してのみ EXPLAIN レコードを生成します。
表 1. 各種の EXPLAIN ステートメント・オプションの EXPLAIN レコードの起点 指定するオプション Db2 が EXPLAIN レコードを作成する方法 EXPLAIN PLAN FOR explainable-sql-statement
アクセス・パス選択プロセスを使用して、EXPLAIN レコードを生成します。 EXPLAIN PACKAGE ...
パッケージから既存のアクセス・パス情報を抽出して、EXPLAIN レコードを作成します。 EXPLAIN STMTCACHE ...
動的ステートメント・キャッシュからアクセス・パス情報を抽出して、EXPLAIN レコードを作成します。 EXPLAIN STABILIZED DYNAMIC QUERY ...
指定の固定化された動的 SQL ステートメントのカタログ表からアクセス・パス情報を抽出します。
EXPLAIN 表の各行は、EXPLAIN 可能ステートメント内の照会または副照会の実行における 1 つのステップの側面を記述しています。 その行の列の値は、照会または副照会、関係する表およびオブジェクト、各ステップの実行に使用されるメソッド、およびそれらのメソッドに関するコスト情報などを示します。
これらの表のインスタンスは、特定の最適化ツールによっても作成および使用される可能性があります。 計画表およびその他のEXPLAIN表における異なる値の意味については、「EXPLAINを使用したデータアクセス解釈 」を参照してください。
EXPLAIN テーブル間で情報を相関させる方法については、 「EXPLAIN テーブル間で情報を相関させる」を参照してください。
EXPLAIN 表には、Db2 で生成された
DSN
で始まる名前が含まれている場合があります。重要: 最適化ツールによって作成されたEXPLAINテーブル内のデータを、手動で操作しないでください。 - EXPLAIN 表に実施される列アクセス制御または行の許可:
- EXPLAIN 表に、列アクセス制御および行の許可を実施できます。 ただし、Db2 がこれらの表に行を挿入する場合、行の許可と列マスクは適用されません。
指定されたステートメントが、行アクセス制御または列アクセス制御がアクティブな表を参照している場合、この表に関する作成済みの行の許可および列マスク定義からの次の情報が EXPLAIN 表に含まれる可能性があります。
- DSN_FUNCTION_TABLE - ユーザー定義関数
- DSN_PREDICAT_TABLE - 述部 (CASE WHEN 文節内の述部を除く)
- DSN_STRUCT_TABLE - 照会ブロック
- PLAN_TABLE - 副照会のアクセス・パス
さらに、完全定義または部分定義テキストが DSN_FUNCTION_TABLE、DSN_PREDICAT_TABLE、DSN_QUERY_TABLE、DSN_SORTKEY_TABLE、DSN_STATEMENT_CACHE_TABLE、および DSN_STATEMENT_RUNTIME_INFO などの EXPLAIN 表に表示されることがあります。
- 表に列アクセス制御または行の許可を実施した際の既存のアクセス・パスへの影響:
- 行の許可からの述部は、アクセス・パス選択の際に考慮されます。 したがって、それらの述部は、パフォーマンス調整の目的で EXPLAIN 表に示されます。
動的 SQL ステートメントで存在しないオブジェクトを参照する場合の EXPLAIN 表への影響
存在しないオブジェクトを参照する動的 SQL ステートメントで EXPLAIN が実行される状況では、オブジェクトが Db2 サブシステムで定義されていないことを示すために SQLCODE -204 が発行されます。 ただし、関連する EXPLAIN 表への変更はロールバックされない場合があります。
- 行セット照会のアクセラレーションの EXPLAIN レコードをキャプチャーするときの考慮事項:
- 以下の状況では、行セット照会をアクセラレーター・サーバーに渡して処理することはできません。
- 行セット照会がリモートで実行されている場合
- 行セット照会が WITH RETURN と宣言されている場合
- 行セット照会が SQL PL ルーチンのもとで実行される場合
静的 EXPLAIN ステートメントに対して WITH ROWSET POSITIONING カーソル属性を指定することはできないため、行セット照会がアクセラレーター・サーバーに渡されるかどうかを決定するために静的 EXPLAIN ステートメントを使用することはできません。 代わりに、動的 EXPLAIN ステートメントを使用する必要があります。ここでは、WITH ROWSET POSITIONING 節を属性ストリングで指定します。 また、属性ストリングで WITH RETURN 節を指定して結果セットの非適格性を確認することもできます。
また、照会がリモートで、または SQL PL ルーチンのもとで実行されているため、行セット照会をアクセラレーター・サーバーに渡すことができないという決定をするために EXPLAIN ステートメントを使用することはできません。 EXPLAIN ステートメントの PREPARE がローカルで実行される場合、Db2 は、ローカル照会オフロードとして行セット照会を高速化できるかどうかを判別します。 ただし、EXPLAIN ステートメントの PREPARE がリモートで実行される場合、Db2 は、行セット照会を高速化できないことを示します。 代わりに、CURRENT EXPLAIN MODE 特殊レジスターを使用して、アプリケーション実行時に適格な動的 SQL ステートメントの動作を決定することができます。 詳細は、CURRENT EXPLAIN MODE 特殊レジスタを参照してください。
- EXPLAIN表
- EXPLAINテーブルの説明については、EXPLAINテーブルを参照してください。
例 EXPLAIN
SELECT
X.ACTNO...
」 を実行するために必要なステップを判別します。 PLAN_TABLE の中に、QUERYNO 列の値が 13 である行のセットはないものと仮定します。 EXPLAIN PLAN SET QUERYNO = 13
FOR SELECT X.ACTNO, X.PROJNO, X.EMPNO, Y.JOB, Y.EDLEVEL
FROM DSN8C10.EMPPROJACT X, DSN8C10.EMP Y
WHERE X.EMPNO = Y.EMPNO
AND X.EMPTIME > 0.5
AND (Y.JOB = 'DESIGNER' OR Y.EDLEVEL >= 12)
ORDER BY X.ACTNO, X.PROJNO;
SELECT * FROM PLAN_TABLE A, DSN_STATEMNT_TABLE B
WHERE A.QUERYNO = 13 and B.QUERYNO = 13
ORDER BY A.QBLOCKNO, A.PLANNO, A.MIXOPSEQ;
EXPLAIN STMTCACHE STMTID :SID;
EXPLAIN STMTCACHE ALL;
EXPLAIN PLAN SET QUERYNO = 101
FOR SELECT * FROM DSN8C10.EMP;
EXPLAIN PACKAGE COLLECTION 'COLLA' PACKAGE 'PACK52604' COPY 'CURRENT';