再最適化されたアクセス・パスの取り込み

特定の REOPT オプションが指定されている場合、SQL ステートメントの再最適化されたアクセス・パスを正確に反映する EXPLAIN 情報の取り込みには特別な手段が必要になります。

このタスクについて

実行時に再最適化されるSQLステートメントに関するEXPLAIN情報は、Db2が実行時に使用するアクセス・パスを常に表しているわけではありません。 例えば、以下の各状況では、キャプチャーされたEXPLAIN情報は、リテラル値が不明な場合にDb2が選択するアクセス・パスを反映しています。
  • REOPT(ALWAYS) オプションを使用する静的 SQL ステートメントについては、EXPLAIN(YES) がバインド時に指定されている場合。
  • パラメーター・マーカーと特殊レジスターが含まれており、REOPT(ONCE) または REOPT(AUTO) オプションを使用する動的 SQL ステートメントについては、EXPLAIN PLAN ステートメントが発行された場合。

したがって、Db2は、リテラル値が既知の場合に、実行時に別のアクセス・パスを選択することがあります。

プロシージャー

実行時に再最適化されるステートメントのアクセス・パスを正確に反映する EXPLAIN 情報を取り込むには、以下の方法を使用します。

  • パフォーマンス・トレース・クラス 30 (IFCID 0022 および IFCID 0063) をアクティブにし、特定の AUTHID および PLANNAME にトレースを限定する有効範囲を設定します。
    この有効範囲により、収集されるトレース・レコードが対象となるプランとユーザーに対して固有になります。 パフォーマンス・トレースは、Db2がステートメントを準備するたびに生成されるSQLステートメント・テキストおよびバインド・レコードを収集します。 結果には、ステートメントが発行されるたびにDb2が生成する実際のアクセス・パスが表示されます。 IFCID 0247 をアクティブにして、ステートメントが準備されるたびに使用されるリテラル値を取り込むこともできます。
  • REOPT(ONCE) オプションで処理されるステートメントの場合は、次のように、動的ステートメント・キャッシュ内のステートメントから EXPLAIN レコードを取り込みます。
    1. ステートメント ID とトークンを見つけます。
      これらの値は、以下のステートメントを発行して検索することができます。
      EXPLAIN STMTCACHE ALL;

      STMTCACHE ALLを指定すると、Db2は、DSN_STATEMENT_CACHE_TABLEのデータのみを取り込みます。 他の EXPLAIN 表にはレコードは取り込まれません。

    2. ステートメント・キャッシュから EXPLAIN レコードを抽出して、それを EXPLAIN 表に書き込みます。
      例えば、以下のいずれかのステートメントを発行できます。
      EXPLAIN STMTCACHE STMTID statement-ID
      EXPLAIN STMTCACHE STMTTOKEN statement-token
      これらのステートメントを発行すると、指定されたステートメントに関する情報が EXPLAIN 表に取り込まれます。
    REOPT(AUTO) オプションを使用するステートメントの方法を使用することもできます。 ただし、この方法で取り込まれる EXPLAIN レコードは、最後に使用されたアクセス・パスにのみ適用されます。 その場合、取得されたアクセス・パスが、問題発生時に使用されたアクセス・パスと一致するかどうかを判断できない可能性があります。