EXPLAIN_FROM_DATA プロシージャー - 入力セクションを使用したステートメントの Explain
EXPLAIN_FROM_DATA プロシージャーは、入力セクションの内容を使用してステートメントを Explain します。
Explain の出力は Explain 表に格納され、任意の既存の Explain ツール (例えば db2exfmt) を使ってこれを処理できます。
許可
- ルーチンに対する EXECUTE 特権
- DATAACCESS 権限
- DBADM 権限
- SQLADM 権限
- EXPLAIN 権限
- 指定されたスキーマ内の Explain 表に対する INSERT 特権
- 指定されたスキーマ内の Explain 表に対する CONTROL 特権
- DATAACCESS 権限
デフォルトの PUBLIC 特権
なし
構文
スキーマは 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_requester、explain_time、source_name、source_schema、source_version はキーを構成し、これを使って Explain 表内のセクションに関する Explain 情報を検索します。 セクションから取得された Explain 情報をフォーマット設定するために、既存の任意の Explain ツール (例えば db2exfmt) でこれらのパラメーターを使用できます。
このプロシージャーは、Explain 表への挿入後に COMMIT を発行しません。 プロシージャーの呼び出し元が COMMIT を発行する必要があります。
例
パッケージ・キャッシュ・イベント・モニターを使って多数のステートメントをキャプチャーした後、(EVMON_FORMAT_UE_TO_TABLE ストアード・プロシージャーを使って) PKGCACHE という表にイベント・モニター・データを抽出したとします。 表のデータを調べてみると、非常にコストが高い、実行可能 ID「x'0100000000000000070000000000000000000000000200200811261904103698'」のステートメントが見つかりました。
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;