EXPLAIN ステートメント

EXPLAIN文は、 説明可能な文のアクセスパスの選択に関する情報を取得します。 変更の開始SELECT、MERGE、TRUNCATE、INSERT文、またはUPDATEまたはDELETE文の検索フォームである場合、その文は説明可能である。変更の終わり 取得された情報は、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 特権を持っている
PLAN キーワードと ALL キーワードを使用する EXPLAIN ステートメントの場合、以下に定義されている特権セットには、少なくとも以下のいずれかが含まれている必要があります。
  • EXPLAIN
  • SQLADM
  • システム DBADM
  • EXPLAIN ステートメントで指定する SQL ステートメントに対して定義される許可規則。 例えば、DELETE ステートメントの EXPLAIN レコードがキャプチャーされるときに適用される許可規則は、DELETE ステートメントに対する許可規則です。

変更の開始FL 500 STMTCACHE または STABILIZED DYNAMIC QUERY キーワードが指定されている場合、承認ルールは異なります。 特権セットには、少なくとも次のいずれかが含まれていなければなりません。変更の終わり

  • SQLADM 権限
  • SYSADM 権限
  • キャッシュ・ステートメントを共有するために必要な権限。 動的ステートメントキャッシュの使用権限に関する詳細は、「ステートメント共有の条件」 を参照してください。
  • システム DBADM 権限
STMTCACHE ALL 文節を含む EXPLAIN ステートメントの場合、特権セットには、少なくとも次のいずれかが含まれていなければなりません。
  • SQLADM 権限
  • システム DBADM 権限
  • SYSADM 権限

特権セットに必要な権限がない場合は、特権セットと同じ許可 ID を持つステートメントのみの EXPLAIN レコードがキャプチャーされます。

PACKAGE キーワードの場合、特権セットには、少なくとも次のいずれかが含まれていなければなりません。
  • SQLADM 権限
  • SYSADM 権限
  • SYSOPR 権限
  • SYSCTRL 権限

特権セット: 特権セットには、プロセスの許可 ID が所有する権限の和集合が含まれます。 ロールを持つトラステッド・コンテキスト内でプロセスを実行している場合、このロールは、そのプロセスの許可 ID として組み込まれます。

構文 EXPLAIN

構文図を読むビジュアルシンタックスダイアグラムをスキップする EXPLAIN PLANALLSET QUERYNO= 整数FOR説明可能なSQL文STMTCACHEALLSTMTIDidホスト変数整数定数STMTTOKENトークンホスト変数ひもていすうPACKAGEパッケージ適用範囲指定STABILIZED DYNAMIC QUERY STMTIDidホスト変数整数定数COPY 'CURRENT'COPY 'INVALID'

パッケージスコープ仕様:

構文図を読むビジュアルシンタックスダイアグラムをスキップする COLLECTION コレクション名 PACKAGE パッケージ名 VERSIONバージョン名COPYコピーID

説明の対象: 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
integerexplainable-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
ステートメント ID は、動的ステートメント・キャッシュに入れられたステートメントを一意的に識別する整数です。 キャッシュされたステートメントのステートメントIDは、IFCID 316または124からIFIモニター機能を通じて取得できます。 また、0173、0196、0337 などの診断トレース・レコードも、ステートメント ID を示しています。

戻される 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
ステートメント・トークンは、240 バイト以下の文字ストリングであることが必要です。 最初にステートメントを準備し、キャッシュに挿入したアプリケーション・プログラムが、ステートメント・トークンをキャッシュ・ステートメントと関連付けます。 プログラムは、RRSAF SET_ID 関数を使用してこの関連付けを行うことができます。また、プログラムがリモート側で接続されている場合は、sqleseti API を使用します。

戻される 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

例 1: クエリー 「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;
例 2: 例 1 で戻された情報を検索します。 ステートメント表が存在すると仮定すると、照会の処理にかかる見積もりコストも検索します。 プラン表とステートメント表を結合する以下の照会文を使用します。
  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;
例 3: 既存のアクセス・パス情報を抽出して、ステートメント ID 124 を持つキャッシュ・ステートメントの EXPLAIN レコードをキャプチャーします。 ホスト変数 SID の内容は 124 であるとします。
EXPLAIN STMTCACHE STMTID :SID; 
例 4: 既存のアクセス・パス情報を抽出して、動的ステートメント・キャッシュ内のステートメントごとに 1 行の EXPLAIN データをキャプチャーします。 レコードは、DSN_STATEMENT_CACHE_TABLE のみに書き込まれます。
EXPLAIN STMTCACHE ALL; 
例 5 ADMF001 によって作成されたプラン表を使用し、許可 ID は SYSADM であるとします。 ADMF001.PLAN_TABLE (CREATE ALIAS SYSADM.PLAN_TABLE FOR ADMF001.PLAN_TABLE) の別名と、この表に対する十分な INSERT 特権および SELECT 特権があれば、次の EXPLAIN ステートメントが実行され、ADMF001.PLAN_TABLE にデータが追加されます。
  EXPLAIN PLAN SET QUERYNO = 101
    FOR SELECT * FROM DSN8C10.EMP;
例 6: 既存のアクセス・パス情報を抽出して、パッケージ「COLLA.PACK52604」の現行コピー内のすべての静的 SQL ステートメントに関する EXPLAIN レコードを現行ユーザーの PLAN_TABLE にキャプチャーします。
  EXPLAIN PACKAGE COLLECTION 'COLLA' PACKAGE 'PACK52604' COPY 'CURRENT';

プログラム固有のプログラミングインターフェース情報を終了します。