EXPLAIN ステートメント

EXPLAIN ステートメントは、 指定された EXPLAIN 可能ステートメントに関して選択されたアクセス・プランについての情報をキャプチャーするとともに、 この情報を Explain 表に入れます。

EXPLAIN 可能ステートメント は、有効な XQuery ステートメント、または SQL ステートメント CALL、コンパウンド SQL (動的)、DELETE、INSERT、MERGE、REFRESH、SELECT、SELECT INTO、SET INTEGRITY、UPDATE、VALUES、VALUES INTO のいずれかです。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込むか、あるいは対話式に発行することができます。 このステートメントは、動的に作成できる実行可能ステートメントです。

Explain 情報を取り込むステートメントは実行されません。

許可

ステートメントの許可 ID には、少なくとも以下のいずれかの許可がなければなりません。
  • DATAACCESS 権限。この権限により、INSERT、UPDATE、DELETE、SELECT のステートメントが許可されます。
  • Explain 表が含まれるスキーマに対する DATAACCESS 権限
  • Explain 表での INSERT 特権と、少なくとも以下のいずれかの許可:
    • EXPLAIN ステートメントに指定された EXPLAIN 可能ステートメントの実行に必要なすべての特権 (例えば、DELETE ステートメントが EXPLAIN 可能ステートメントとして使用される場合、DELETE ステートメントの Explain 情報の取得時には DELETE ステートメントに関する許可規則が適用される)
    • EXPLAIN 権限
    • SQLADM 権限
    • DBADM 権限

構文

Read syntax diagramSkip visual syntax diagramEXPLAIN PLAN SELECTIONALLPLAN1 FORWITHSNAPSHOTWITH REOPT ONCESET QUERYNO = integerSET QUERYTAG = string-constantFOR explainable-sql-statementXQUERY'explainable-xquery-statement'
Notes:
  • 1 The PLAN option is supported only for syntax toleration of existing Db2® for z/OS® EXPLAIN statements. There is no PLAN table. Specifying PLAN is equivalent to specifying PLAN SELECTION.

説明

PLAN SELECTION
照会コンパイルのプラン選択フェーズからの情報を Explain 表に挿入することを示します。
すべて
ALL を指定することは、PLAN SELECTION を指定するのと同等です。
PLAN
PLAN オプションの指定によって、 他のシステムからの既存データベース・アプリケーションの構文の相違を許容します。 PLAN を指定することは、PLAN SELECTION を指定するのと同等です。
FOR SNAPSHOT
この節は、Explain スナップショットだけを取り、 それを EXPLAIN_STATEMENT 表の SNAPSHOT 列に入れることを示します。 EXPLAIN_INSTANCE および EXPLAIN_STATEMENT 表に存在するもの以外の Explain 情報はキャプチャーされません。
WITH SNAPSHOT
この節は、通常の Explain 情報に加えて、Explain スナップショットも取ることを示します。

デフォルトでは、EXPLAIN ステートメントは通常の Explain 情報だけを収集し、 Explain スナップショットは取りません。

デフォルト (FOR SNAPSHOT も WITH SNAPSHOT も指定しない場合)
Explain 情報を Explain 表に入れます。
WITH REOPT ONCE
この節は、 WITH REOPT ONCE で EXPLAIN 可能ステートメントを再最適化するのに以前使用したホスト変数、パラメーター・マーカー、特殊レジスター、またはグローバル変数の値を使用して、このステートメントを再最適化することを指示します。 Explain 表には、新しいアクセス・プランが取り込まれます。 ユーザーが DBADM 権限を持っているか、 データベース・レジストリー変数 DB2_VIEW_REOPT_VALUES が YES に設定されている場合は、 EXPLAIN_PREDICATE 表にも値が取り込まれます (それらの値を使ってステートメントを再最適化する場合)。
SET QUERYNO = 整数
EXPLAIN_STATEMENT 表の QUERYNO 列を介して、 integerexplainable ステートメントに関連付けます。 指定する整数値は、正の値でなければなりません。

動的 EXPLAIN ステートメントにこの節を指定しなかった場合は、デフォルト値 (1) が割り当てられます。 静的 EXPLAIN ステートメントの場合には、 プリコンパイラーによって割り当てられるステートメント番号がデフォルト値として割り当てられます。

SET QUERYTAG = ストリング定数
EXPLAIN_STATEMENT 表の QUERYTAG 列を介して、 string-constantexplainable ステートメントに関連付けます。 string-constant には、長さ 20 バイトまでの任意の文字ストリングを指定できます。 指定された値が 20 バイトに満たない場合は必要な長さに達するまで右側にブランクが埋め込まれます。

EXPLAIN ステートメントにこの節を指定しなかった場合はデフォルト値としてブランクが使用されます。

FOR EXPLAINABLE-SQL-ステートメント
Explain 情報を取り出す SQL ステートメントを指定します。 このステートメントは、有効な SQL ステートメント CALL、コンパウンド SQL (動的)、DELETE、INSERT、MERGE、REFRESH、SELECT、SELECT INTO、SET INTEGRITY、UPDATE、VALUES、VALUES INTO のいずれかです。 EXPLAIN ステートメントがプログラムに組み込まれている場合には、 explainable-sql-statement にホスト変数に対する参照を含めることができます (ただし、 これらのホスト変数がプログラム内で定義されている必要があります)。 同様に、EXPLAIN が動的に準備される場合には、 explainable-sql-statement にパラメーター・マーカーを含めることができます。

explainable-sql-statement には、 EXPLAIN ステートメントによってそれぞれ個別に準備および実行された有効な SQL ステートメントを指定する必要があります。 ステートメント名やホスト変数を指定することはできません。 CLP を使用して定義されたカーソルを参照する SQL ステートメントを、 このステートメントで使用することはできません。

アプリケーション内の動的 SQL に関する Explain 情報を取り出すためには、 EXPLAIN ステートメント全体を動的に準備する必要があります。

FOR XQUERY 'EXPLAIN 可能-XQUERY-ステートメント'
Explain 情報を取り出す XQUERY ステートメントを指定します。 このステートメントとしては、任意の有効な XQUERY ステートメントを指定できます。

EXPLAIN ステートメントをプログラムに埋め込む場合は、'explainable-xquery-statement' にホスト変数の参照を組み込むことができます。ただし、そのホスト変数を最上位の XQUERY ステートメントで使用するのではなく、XMLQUERY 関数の XMLEXISTS 述部によって、または XMLTABLE 関数によって渡すことが必要です。 ホスト変数は、プログラムの中で定義しなければなりません。

同様に、EXPLAIN を動的に準備する場合は、'explainable-xquery-statement' にパラメーター・マーカーを組み込むことができます。ただし、ホスト変数を渡す場合と同じ制約事項を守ることが必要です。

さらに、Db2 XQUERY 関数 db2-fn:sqlquery を使用して、ホスト変数やパラメーター・マーカーの参照を指定した SQL ステートメントを埋め込むことも可能です。

'explainable-xquery-statement' には、 EXPLAIN ステートメントによってそれぞれ個別に準備および実行された有効な XQUERY ステートメントを指定する必要があります。 CLP を使用して定義されたカーソルを参照する照会ステートメントを、 このステートメントで使用することはできません。

  • Explain 機能は、データの取り込み先である Explain 表を修飾するときに、スキーマとして以下の ID を使用します。
    • 動的 SQL のセッション許可 ID
    • 静的 SQL のステートメント許可 ID
    そのスキーマは、一連の Explain 表に関連付けられている場合もあれば、別のスキーマの下で一連の Explain 表を参照する別名に関連付けられている場合もあります。 そのスキーマの下で Explain 表が検出されなかった場合、Explain 機能は、SYSTOOLS スキーマの下に Explain 表があるかどうかをチェックし、その表を使用しようとします。
  • 次の表は、スナップショット・キーワードと Explain 情報の相互の関連を示しています。
    指定したキーワード Explain 情報をキャプチャーするか?
    なし はい
    FOR SNAPSHOT いいえ
    WITH SNAPSHOT はい
    FOR SNAPSHOT 節と WITH SNAPSHOT 節のどちらも指定しなかった場合は、 Explain スナップショットは取られません。
  • EXPLAIN ステートメントを呼び出す前に、Explain 表を作成しておく必要があります。 このステートメントが生成した情報は、 ステートメントをコンパイルした時点で指定されたスキーマにあるそれぞれの Explain 表に保管されます。
  • 指定した EXPLAIN 可能ステートメントのコンパイル中に何らかのエラーが発生すると、Explain 表に情報は取り込まれません。
  • EXPLAIN 可能ステートメントについて生成されたアクセス・プランは保管されません。 したがって、後から呼び出すことはできません。 EXPLAIN 可能ステートメント についての Explain 情報が挿入されるのは、EXPLAIN ステートメント自体のコンパイルが正常に完了した場合です。
  • 静的 EXPLAIN 照会ステートメントの場合、 情報はバインド時および明示的な再バインド時に Explain 表に挿入されます。 プリコンパイル中、静的 EXPLAIN ステートメントはコメント化され、 修正済みのアプリケーション・ソース・ファイルに書き込まれます。 バインド時に、EXPLAIN ステートメントは SYSCAT.STATEMENTS カタログに保管されます。 パッケージが実行される時は、EXPLAIN ステートメントは実行されません。 アプリケーション内にあるすべてのステートメントのセクション番号は連続した順序に並べられます。 その中には EXPLAIN ステートメントも含まれることに注意してください。 静的 EXPLAIN ステートメントを使用する代わりに、 EXPLAIN と EXPLSNAP BIND または PREP オプションを組み合わせることもできます。 静的 EXPLAIN ステートメントを使用することにより、 数多くある静的照会ステートメントの中からただ 1 つだけ静的照会ステートメントを選び出し、 そのステートメントに関する情報を Explain 表に入れることもできます。 そのことは、適切な EXPLAIN ステートメント構文を指定したターゲット・ステートメントに簡単な接頭部を付け、 Explain の BIND または PREP オプションのどちらも使用せずにアプリケーションをバインドすることによって行えます。 実際の Explain の呼び出し時に QUERYNO または QUERYTAG フィールドを設定することが有利な場合にも、 EXPLAIN ステートメントを使用することができます。
  • SQL プロシージャー内の静的 EXPLAIN ステートメントは、プロシージャーのコンパイル時に評価されます。
  • 追加バインド EXPLAIN 照会ステートメントの場合、Explain 表に情報が入れられるのは、 EXPLAIN ステートメントのコンパイルがサブミットされるときです。 パッケージが実行される時は、EXPLAIN ステートメントは実行されません (ただし、ステートメントは正常終了します)。 Explain 表にデータを取り込む際、Explain 表の修飾子と許可 ID には、 パッケージ所有者の修飾子と許可 ID が使用されます。 実際の Explain の呼び出し時に QUERYNO または QUERYTAG フィールドを設定することが有利な場合にも、 EXPLAIN ステートメントを使用することができます。
  • 動的 EXPLAIN ステートメントの場合、Explain 表に情報が入れられるのは、 EXPLAIN ステートメントのコンパイルがサブミットされるときです。 PREPARE ステートメントを指定して EXPLAIN ステートメントを準備することもできますが、 そのようにして実行しても処理は行われません (ステートメントは正常終了します)。 動的 EXPLAIN ステートメントを発行する代わりに、 CURRENT EXPLAIN MODE および CURRENT EXPLAIN SNAPSHOT 特殊レジスターを組み合わせて使用することによっても、 動的照会ステートメントの Explain 情報を取り出すことができます。 実際の Explain の呼び出し時に QUERYNO または QUERYTAG フィールドを設定することが有利な場合には、 EXPLAIN ステートメントを使用してください。
  • REOPT BIND オプションが ONCE に設定されていて、CURRENT EXPLAIN MODE または CURRENT EXPLAIN SNAPSHOT 特殊レジスターのいずれかが REOPT に設定されている場合、ホスト変数、特殊レジスター、パラメーター・マーカー、またはグローバル変数を含む静的および動的照会ステートメントを実行すると、ステートメントが再最適化されるときにのみ、ステートメントの Explain 情報がキャプチャーされます。 一方、REOPT BIND オプションが ALWAYS に設定されている場合は、 それらのステートメントが実行されるたびに Explain 情報がキャプチャーされます。

  • 例 1: 単純な SELECT ステートメントの Explain 情報を取り出し、 QUERYNO = 13 のタグを付けます。
       EXPLAIN PLAN SET QUERYNO = 13
         FOR SELECT C1
         FROM T1
  • 例 2: 単純な SELECT ステートメントの Explain 情報を取り出し、 QUERYTAG = 'TEST13' のタグを付けます。
       EXPLAIN PLAN SELECTION SET QUERYTAG = 'TEST13'
         FOR SELECT C1
         FROM T1
  • 例 3: 単純な SELECT ステートメントの Explain 情報を取り出し、 QUERYNO = 13 および QUERYTAG = 'TEST13' のタグを付けます。
       EXPLAIN PLAN SELECTION SET QUERYNO = 13 SET QUERYTAG = 'TEST13'
         FOR SELECT C1
         FROM T1
  • 例 4: Explain 表が存在しない場合に、Explain 情報の入手を試みます。
       EXPLAIN ALL FOR SELECT C1
         FROM T1
    このステートメントは失敗します。Explain 表が定義されていないからです (SQLSTATE 42704)。
  • 例 5: 以下のステートメントがパッケージ・キャッシュ内に見出され、 REOPT ONCE を使ってすでにコンパイルされている場合に、ステートメントは成功します。
       EXPLAIN ALL WITH REOPT ONCE FOR SELECT C1
         FROM T1
         WHERE C1 = :<host variable>
  • 例 6: 以下の例では、db2-fn:xmlcolumn 関数を使用します。この関数は、XML 列の大文字/小文字の区別のある名前を引数として取り、XML 列の値の連結である XML シーケンスを戻します。
    BUSINESS.CUSTOMER という表に、INFO という XML 列があるとします。 INFO 列からすべての文書を戻す簡単な XQuery は、以下のとおりです。
       EXPLAIN PLAN SELECTION 
          FOR XQUERY 'db2-fn:xmlcolumn ("BUSINESS.CUSTOMER.INFO")'

    列の値が NULL の場合、その行の結果として生成される戻りシーケンスは空になります。