EXPLAIN_FROM_DATA プロシージャー - 入力セクションを使用したステートメントの Explain

EXPLAIN_FROM_DATA プロシージャーは、入力セクションの内容を使用してステートメントを Explain します。

Explain の出力は Explain 表に格納され、任意の既存の Explain ツール (例えば db2exfmt) を使ってこれを処理できます。

許可

このルーチンを実行するには、以下のいずれかの権限または特権が必要です。
  • ルーチンに対する EXECUTE 特権
  • DATAACCESS 権限
  • DBADM 権限
  • SQLADM 権限
  • EXPLAIN 権限
さらに、グループに付与された特権を含め、セッションの許可 ID によって保持されている特権には、少なくとも以下のいずれかが含まれていなければなりません。
  • 指定されたスキーマ内の Explain 表に対する INSERT 特権
  • 指定されたスキーマ内の Explain 表に対する CONTROL 特権
  • DATAACCESS 権限

デフォルトの PUBLIC 特権

なし

構文

構文図を読む構文図をスキップするEXPLAIN_FROM_DATA(section ,stmt_text,executable_id,explain_schema ,explain_requester,explain_time ,source_name,source_schema ,source_version)

スキーマは SYSPROC です。

プロシージャー・パラメーター

section
Explain 対象のセクションが含まれる、タイプ BLOB(134M) の入力引数。 イベント・モニター表、カタログ表など、さまざまなソースからセクションを取得できます。 SQL20503N は、以下のような状況で返されます。
  • 入力セクションが有効なセクションではない
  • 入力セクションが別のオペレーティング・システムのデータベースからのものである
stmt_text
オプションの、タイプ CLOB(2M) の入力引数。入力セクションに対応するステートメントのテキストが含まれます。 stmt_text が NULL の場合、フォーマット済み Explain 出力にはステートメント・テキストが含まれません。
executable_id
オプションの、タイプ VARCHAR(32) FOR BIT DATA の入力引数。セクションの識別に使用される実行可能 ID が含まれます。 executable_id が NULL の場合、フォーマット済み Explain 出力には実行可能 ID が含まれません。
explain_schema
タイプ VARCHAR(128) のオプションの入力または出力引数。Explain 情報が書き込まれる Explain 表を含むスキーマを指定します。 空ストリングまたは NULL を指定した場合、セッション許可 ID のもとで Explain 表が検索され、その後、SYSTOOLS スキーマで検索されます。 Explain 表が見つからない場合、SQL0219N が戻されます。 呼び出し元が Explain 表に対する INSERT 特権を持っていない場合、SQL0551N が戻されます。 出力の場合、このパラメーターは、情報が書き込まれた Explain 表を含んでいるスキーマに設定されます。
explain_requester
タイプ VARCHAR(128) の出力引数。このルーチンが呼び出された接続のセッション許可 ID が格納されます。
explain_time
Explain 要求の開始時刻を格納する、タイプ TIMESTAMP の出力引数。
source_name
タイプ VARCHAR (128) の出力引数。ステートメントの準備時またはコンパイル時に実行されていたパッケージの名前を格納します。
source_schema
ソース Explain 要求のスキーマまたは修飾子を格納する、タイプ VARCHAR(128) の出力引数。
source_version
Explain 要求のソースのバージョンを格納する、タイプ VARCHAR(64) の出力引数。

制約事項

EXPLAIN_FROM_DATA ストアード・プロシージャーへの入力として渡されるセクションは、EXPLAIN_FROM_DATA ストアード・プロシージャー呼び出しに使用されるデータベースと同じアーキテクチャーのデータベースから取得する必要があります。

使用上の注意

入力セクションは、以下のようなさまざまなソースから入手可能です。
  • アクティビティー・イベント・モニター
  • パッケージ・キャッシュ・イベント・モニター
  • カタログ表
  • 上記のいずれかの場所からセクションをコピーした、任意のユーザー表または入力ソース。

出力パラメーター explain_requesterexplain_timesource_namesource_schemasource_version はキーを構成し、これを使って Explain 表内のセクションに関する Explain 情報を検索します。 セクションから取得された Explain 情報をフォーマット設定するために、既存の任意の Explain ツール (例えば db2exfmt) でこれらのパラメーターを使用できます。

このプロシージャーは、Explain 表への挿入後に COMMIT を発行しません。 プロシージャーの呼び出し元が COMMIT を発行する必要があります。

パッケージ・キャッシュ・イベント・モニターを使って多数のステートメントをキャプチャーした後、(EVMON_FORMAT_UE_TO_TABLE ストアード・プロシージャーを使って) PKGCACHE という表にイベント・モニター・データを抽出したとします。 表のデータを調べてみると、非常にコストが高い、実行可能 ID「x'0100000000000000070000000000000000000000000200200811261904103698'」のステートメントが見つかりました。

このステートメントのアクセス・プランを把握するために EXPLAIN_FROM_DATA プロシージャーを発行し、PKGCACHE 表の項目からのセクションを入力として渡します。 MYSCHEMA スキーマの Explain 表の中に Explain 出力を書き込みます。
SET SERVEROUTPUT ON;

BEGIN
  DECLARE EXECUTABLE_ID VARCHAR(32) FOR BIT DATA; --
  DECLARE SECTION BLOB(134M); --
  DECLARE STMT_TEXT CLOB(2M); --
  DECLARE EXPLAIN_SCHEMA VARCHAR(128); --

  DECLARE EXPLAIN_REQUESTER VARCHAR(128); --
  DECLARE EXPLAIN_TIME TIMESTAMP; --
  DECLARE SOURCE_NAME VARCHAR(128); --
  DECLARE SOURCE_SCHEMA VARCHAR(128); --
  DECLARE SOURCE_VERSION VARCHAR(128); --

  SET EXPLAIN_SCHEMA = 'MYSCHEMA'; --

  SELECT P.SECTION, P.STMT_TEXT, P.EXECUTABLE_ID INTO 
         SECTION, STMT_TEXT, EXECUTABLE_ID
  FROM PKGCACHE WHERE EXECUTABLE_ID =
   x'0100000000000000070000000000000000000000000200200811261904103698'; --

  CALL EXPLAIN_FROM_DATA( SECTION, 
                          STMT_TEXT, 
                          EXECUTABLE_ID, 
                          EXPLAIN_SCHEMA, 
                          EXPLAIN_REQUESTER,
                          EXPLAIN_TIME,
                          SOURCE_NAME,
                          SOURCE_SCHEMA,
                          SOURCE_VERSION ); --

  CALL DBMS_OUTPUT.PUT( 'EXPLAIN_REQUESTER = ' ); --
  CALL DBMS_OUTPUT.PUT_LINE( EXPLAIN_REQUESTER ); --
  CALL DBMS_OUTPUT.PUT( 'EXPLAIN_TIME = ' ); --
  CALL DBMS_OUTPUT.PUT_LINE( EXPLAIN_TIME ); --
  CALL DBMS_OUTPUT.PUT( 'SOURCE_NAME = ' ); --
  CALL DBMS_OUTPUT.PUT_LINE( SOURCE_NAME ); --
  CALL DBMS_OUTPUT.PUT( 'SOURCE_SCHEMA = ' ); --
  CALL DBMS_OUTPUT.PUT_LINE( SOURCE_SCHEMA ); --
  CALL DBMS_OUTPUT.PUT( 'SOURCE_VERSION = ' ); --
  CALL DBMS_OUTPUT.PUT_LINE( SOURCE_VERSION ); --
END;

SET SERVEROUTPUT OFF;