EXPLAIN ステートメントは、 指定された Explain 可能ステートメントに関して選択されたアクセス・プランについての情報を取り込むとともに、 この情報を Explain 表に入れます。 (Explain 表と表定義については、付録 K, Explain 表と定義 を参照してください。)
Explain 可能ステートメント とは、 DELETE、INSERT、SELECT、SELECT INTO、UPDATE、VALUES、および VALUES INTO SQL ステートメントのことです。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むか、 あるいは対話式に使用することができます。 このステートメントは、動的に準備可能な実行可能ステートメントです。
Explain 情報を取り込むステートメントは実行されません。
許可
EXPLAIN ステートメントに指定された SQL ステートメントに定義されているのと同じ許可規則が適用されます。 たとえば、explainable-sql-statement (次ページのステートメント構文を参照) として DELETE ステートメントが使用された場合、 DELETE ステートメントに定義されている許可規則が、DELETE ステートメントの Explain 情報を取り出す場合にも適用されます。
静的 EXPLAIN ステートメントの場合の許可規則は、 explainable-sql-statement として渡されるステートメントの静的バージョンに適用される規則と同じです。 動的に準備された EXPLAIN ステートメントに関しては、 explainable-sql-statement パラメーターに指定されたステートメントの動的準備の際に適用された許可規則が使用されます。
現行の許可 ID には、Explain 表に対する挿入特権が必要になります。
構文
>>-EXPLAIN--+-PLAN SELECTION-+---+-----------------------+------> +-ALL------------+ '--+-FOR--+---SNAPSHOT--' | (1) | '-WITH-' '-PLAN-----------' >-----+-------------------------+-------------------------------> '-SET QUERYNO =--integer--' >-----+----------------------------------+----------------------> '-SET QUERYTAG =--string-constant--' >----FOR--explainable-sql-statement----------------------------><
注:
説明
Explain スナップショット情報は、Visual Explain での使用を意図しています。
デフォルトでは、EXPLAIN ステートメントは通常の Explain 情報だけを収集し、 Explain スナップショットは取りません。
Explain スナップショット情報は、Visual Explain での使用を意図しています。
動的 EXPLAIN ステートメントにこの文節を指定しなかった場合は、デフォルト値 (1) が割り当てられます。 静的 EXPLAIN ステートメントの場合には、 プリコンパイラーによって割り当てられるステートメント番号がデフォルト値として割り当てられます。
EXPLAIN ステートメントにこの文節を指定しなかった場合はデフォルト値としてブランクが使用されます。
explainable-sql-statement には、 EXPLAIN ステートメントによってそれぞれ個別に準備および実行された有効な SQL ステートメントを指定する必要があります。 ステートメント名やホスト変数を指定することはできません。 CLP を使用して定義されたカーソルを参照する SQL ステートメントを、 このステートメントで使用することはできません。
アプリケーション内の動的 SQL に関する Explain 情報を取り出すためには、 EXPLAIN ステートメント全体を動的に準備する必要があります。
注
次の表は、スナップショット・キーワードと Explain 情報の相互の関係を示しています。
指定したキーワード | Explain 情報を取り込むか? | Visual Explain 用にスナップショットを取るか? |
---|---|---|
なし | 取り込む | 取らない |
FOR SNAPSHOT | 取り込まない | 取る |
WITH SNAPSHOT | 取り込む | 取る |
FOR SNAPSHOT 文節と WITH SNAPSHOT 文節のどちらも指定しなかった場合は、 Explain スナップショットは取られません。
EXPLAIN を呼び出す前に、Explain 表を作成しておく必要があります。 (Explain 表と表定義については、付録 K, Explain 表と定義 を参照してください。) このステートメントが生成した情報は、 ステートメントをコンパイルした時点で指定されたスキーマにあるそれぞれの Explain 表に保管されます。
指定した explainable-sql-statement のコンパイル中に何らかのエラーが発生すると、 Explain 表には情報が取り込まれません。
explainable-sql-statement について生成されたアクセス・プランは保管されません。 したがって、後から呼び出すということはできません。 explainable-sql-statement についての Explain 情報が挿入されるのは、 EXPLAIN ステートメント自体のコンパイルが正常に完了した場合です。
静的 EXPLAIN SQL ステートメントの場合、 情報はバインド実行時および明示的な再バインド時に Explain 表に挿入されます (コマンド解説書 の REBIND の項を参照)。 プリコンパイル中、静的 EXPLAIN ステートメントについてのコメントは、 修正済みのアプリケーション・ソース・ファイルに書き込まれます。 バインド時に、EXPLAIN ステートメントは SYSCAT.STATEMENTS カタログに保管されます。 パッケージが実行された場合、EXPLAIN ステートメントは実行されません。 アプリケーション内にあるすべてのステートメントのセクション番号は連続した順序に並べられます。 その中には EXPLAIN ステートメントも含まれることに注意してください。 静的 EXPLAIN ステートメントを使用する代わりに、 EXPLAIN と EXPLSNAP BIND/PREP オプションを組み合わせることもできます。 静的 EXPLAIN ステートメントを使用することにより、 数多くある SQL ステートメントの中からただ 1 つだけ静的 SQL ステートメントを選び出し、 そのステートメントに関する情報を Explain 表に入れることもできます。 そのことは、適切な EXPLAIN ステートメント構文を指定したターゲット・ステートメントに簡単な接頭部を付け、 Explain BIND/PREP オプションのどちらかを使用せずにアプリケーションをバインドすることによって行えます。 実際の Explain の呼び出し時に QUERYNO もしくは QUERYTAG フィールドを設定することが有利な場合にも、 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 特殊レジスターを組み合わせて使用することによっても、 動的 SQL ステートメントの Explain 情報を取り出すことができます。 実際の Explain の呼び出し時に QUERYNO もしくは QUERYTAG フィールドを設定することが有利な場合には、 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)。