SET CURRENT EXPLAIN SNAPSHOT ステートメント
SET CURRENT EXPLAIN SNAPSHOT ステートメントは、 CURRENT EXPLAIN SNAPSHOT 特殊レジスターの値を変更します。
このステートメントは、トランザクションの制御下にありません。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むか、あるいは対話式に発行することができます。 このステートメントは、動的に作成できる実行可能ステートメントです。
許可
必要ありません。
構文
説明
- いいえ
- Explain スナップショット機能を使用不可にします。 スナップショットは取られません。 NO は、特殊レジスターの初期値です。
- はい
- Explain スナップショット機能を使用可能にし、 適格な動的 SQL ステートメントに対して内部表記のスナップショットを作成します。 この情報は、EXPLAIN_STATEMENT 表の SNAPSHOT 列に挿入されます。
- EXPLAIN
- Explain スナップショット機能を使用可能にし、 準備済みの適格な動的 SQL ステートメントごとに内部表記のスナップショットを作成します。 ただし、動的ステートメントは実行されません。
- REOPT
- Explain 機能を使用可能にし、実行時のステートメント再最適化の際 (すなわち、ホスト変数、特殊レジスター、グローバル変数、またはパラメーター・マーカーの実際の値が使用可能になるとき) に、静的または動的 SQL ステートメントについての Explain 情報がキャプチャーされるようにします。
- ホスト変数 (host-variable)
- host-variable (ホスト変数) のデータ・タイプは CHAR または VARCHAR でなければならず、その内容の長さは 8 を超えてはなりません。 それより長いフィールドを指定すると、エラーになります (SQLSTATE 42815)。 このレジスターの値は、NO、YES、または EXPLAIN でなければなりません。 実際に指定する値が、指定した置換値より大きい場合は、 入力の右側にブランクを入れる必要があります。 先行ブランクは使用できません (SQLSTATE 42815)。 すべての入力値は、大文字小文字を区別しないものとして処理されます。 host-variable が標識変数を伴っている場合、 その標識変数の値は NULL 値以外でなければなりません (SQLSTATE 42815)。
注
- Explain 機能は、データの取り込み先である Explain 表を修飾するときに、スキーマとして以下の ID を使用します。
- 動的 SQL のセッション許可 ID
- 静的 SQL のステートメント許可 ID
- 静的 SQL ステートメントの Explain スナップショットは、 PREP または BIND コマンドの EXPLSNAP オプションの使用によって取ることができます。 EXPLSNAP オプションの ALL の値を指定し、 CURRENT EXPLAIN SNAPSHOT のレジスター値が NO の場合には、 実行時に動的 SQL ステートメントの Explain スナップショットが取られます。 CURRENT EXPLAIN SNAPSHOT レジスターの値が NO 以外の場合、 EXPLSNAP オプションは無視されます。
- Explain スナップショット機能がアクティブ化される場合、 現行の許可 ID には、Explain 表に対する INSERT 特権が必要です。 この特権がないと、エラー (SQLSTATE 42501) になります。
- ルーチンから SQL ステートメントの Explain 情報を取り出す場合は、 MODIFIES SQL DATA の SQL データ・アクセス標識を指定して、 ルーチンを定義しなければなりません (SQLSTATE 42985)。
- 特殊レジスターが REOPT に設定され、 実行時の再最適化のために SQL ステートメントが修飾されない場合 (すなわち、 ステートメントが入力変数を持っていないか、 REOPT BIND オプションが NONE に設定されている場合) は、Explain 情報はキャプチャーされません。 REOPT BIND オプションが ONCE に設定されている場合、Explain スナップショット情報は、 ステートメントが最初に再最適化されるときの 1 回だけキャプチャーされます。 ステートメントがキャッシュに入れられた後は、後続の実行では、 それ以上の Explain 情報はこのステートメントに関して獲得されません。
- Explain 機能が使用可能で、REOPT BIND オプションが ONCE に設定されていて、 既にキャッシュに入れられている再最適化可能な SQL ステートメントを実行しようとした場合は、 入力変数の現行値を使ってステートメントがコンパイルおよび再最適化され、 それにしたがって Explain スナップショットがキャプチャーされます。 このステートメントのために新たに生成されるアクセス・プランは、 キャッシュに入れられず、実行されません。 このキャッシュ・ステートメントを並行して実行する他のアプリケーションは引き続き稼働し、 このステートメントを実行するための新しい要求は、 既にキャッシュに入れられたアクセス・プランを採用します。
- 静的または動的 SQL ステートメントが入力変数を持っていて、 REOPT BIND オプションが ONCE または ALWAYS に設定されている場合は、 CURRENT EXPLAIN MODE および CURRENT EXPLAIN SNAPSHOT 特殊レジスターの REOPT という値は、 EXPLAIN および EXPLSNAP BIND オプションの値をバインド時にオーバーライドします。
例
- 例 1: 以下のステートメントは、
CURRENT EXPLAIN SNAPSHOT 特殊レジスターを設定して、
以降の適格な動的 SQL ステートメントの Explain スナップショットを取り、
そのステートメントを実行します。
SET CURRENT EXPLAIN SNAPSHOT = YES - 例 2: 以下の例では、CURRENT EXPLAIN SNAPSHOT 特殊レジスターの現行値を検索して SNAP という名前のホスト変数に入れます。
EXEC SQL VALUES (CURRENT EXPLAIN SNAPSHOT) INTO :SNAP;
