記憶域常駐データベース・モニター (ソート情報/CASE と LEFT の組み合わせ)

こちらで紹介したメモリー常駐型 DB モニターでいろいろ情報を見ていく時に、以下の "ACCESS PLAN REBUILD" のところのように文字が化けたようになってしまうことがあります。

このような場合は、単純な CASE でこのコードを置き換えようとしてもうまくいきません。

以下の部分を

/* ACCESS PLAN REBUILD */
QQAPR as "ACCESS PLAN REBUILD",
QQCAPR as "ACCESS PLAN REBUILD COUNT",
QQAPRT as "LAST ACCESS PLAN REBUILT",

を以下のように書き換えます。
つまり、CASE は LEFT 関数を使用したものに関しても使用できるので、左側の 2文字のみを比較するようにしたわけです。

/* ACCESS PLAN REBUILD */
CASE LEFT(QQAPR, 2)
WHEN 'A1' THEN CHAR('参照テーブルの変更')
WHEN 'A2' THEN CHAR('再使用可能ODP使用のため。再使用不可を選択(A2)')
WHEN 'A3' THEN CHAR('再使用不可ODP使用のため。再使用可能を選択(A3)')
WHEN 'A4' THEN CHAR('最終使用から10%以上の変更')
WHEN 'A5' THEN CHAR('新規索引が存在')
WHEN 'A6' THEN CHAR('使用索引の削除もしくは変更')
WHEN 'A7' THEN CHAR('システム・プログラミング変更(A7)')
WHEN 'A8' THEN CHAR('異なるCCSID')
WHEN 'A9' THEN CHAR('ジョブ実行値の変更(日付/時刻)')
WHEN 'AA' THEN CHAR('分類順序テーブル')
WHEN 'AB' THEN CHAR('プールもしくはDEGREEの変更')
WHEN 'AC' THEN CHAR('DB2 SMP機能の導入か削除')
WHEN 'AD' THEN CHAR('DEGREEの変更')
WHEN 'AE' THEN CHAR('ビューの実体化')
WHEN 'AF' THEN CHAR('順序・UDF・関数・SQLパスの変更(AF)')
WHEN 'B0' THEN CHAR('オプションの変更(QAQQINI)')
WHEN 'B1' THEN CHAR('異なるコミットメント制御レベル')
WHEN 'B2' THEN CHAR('静的カーソル応答セットの変更')
WHEN 'B3' THEN CHAR('実パラメーター・マーカー値で最初の実行')
WHEN 'B4' THEN CHAR('参照制約または検査制約の変更')
WHEN 'B5' THEN CHAR('実体化照会テーブルの変更')
ELSE QQAPR
END as "ACCESS PLAN REBUILD",

QQCAPR as "ACCESS PLAN REBUILD COUNT",
QQAPRT as "LAST ACCESS PLAN REBUILT",

ちゃんと見えるようになったのが確認できますね。

「ソート情報」の全文です。

SELECT

/* データベース・パフォーマンス・モニター ソート情報 */

a.QQTIME as "TIME",

/* ソート情報 */
DECIMAL(QQTTIM/1000,18,3) as "SORT TIME",
QQRSS as "NUMBER OF ROWS SORTED",

CASE QQRCOD
WHEN 'F1' THEN '2 次 からの GROUP BY カラム'
WHEN 'F2' THEN '2 次 からの ORDER BY カラム'
WHEN 'F3' THEN 'GROUP BY カラムと ORDER BY カラムが異なる'
WHEN 'F4' THEN 'DISTINCT'
WHEN 'F5' THEN 'UNION'
WHEN 'F6' THEN 'ORDER BY が 120 カラムまたは 2000 バイトを超えている'
WHEN 'F7' THEN '最適化プログラムがパフォーマンスのためにソートを選びました'
WHEN 'F8' THEN '最適化プログラムが入出力待ち時間を最小限に押さえるためにソートを選びました'
WHEN 'F9' THEN '論理ファイル結合タイプが Query タイプと異なっています'
WHEN 'FA' THEN '複数の物理ファイルが 1 つの論理ファイル形式になっています'
WHEN 'FB' THEN '相関した Group By'
WHEN 'FC' THEN '読み取りトリガー'
WHEN 'FD' THEN '静的カーソル'
WHEN 'H1' THEN ' 照会中のテーブルが結合論理ファイルであって、その結合タイプ (JDFTVAL) が照会に指定された結合タイプと一致しない場合'
WHEN 'H2' THEN '論理テーブルに指定された形式が複数の基礎テーブルを参照しています'
WHEN 'H3' THEN 'テーブルは、複合 SQL ビューであって、その SQL ビューの一時結果を必要としています'
WHEN 'H4' THEN '更新可能照会の場合、副選択はこのテーブルの列で、更新中のいずれかの列と一致する列を参照します'
WHEN 'H5' THEN '更新可能照会の場合、副選択は更新中のテーブルを基礎とした SQL ビューを参照します'
WHEN 'H6' THEN '削除可能照会の場合、副選択は行の削除元テーブル、SQL ビュー、または行の削除元テーブルを基礎とした索引のいずれかを参照します'
WHEN 'H7' THEN 'テーブル関数'
ELSE QQRCOD
END as "REASON CODE",

QQSSIZ as "SIZE OF SORT SPACE",
QQPSIZ as "POOL SIZE",
QQPID as "POOL ID",
QQIBUF as "INTERNAL BUFFER LENGTH",
QQEBUF as "EXTERNAL BUFFER LENGTH",
QQQDTN as "SUBSELECT NUMBER",
QQQDTL as "SUBSELECT NEST LEVEL",
QQMATN as "MATERIALIZE VIEW SUBSELECT",
QQMATL as "MATERIALIZE VIEW NEST LEVEL",

/* COSTS */
DECIMAL(QQMAXT/1000,18,3) as "MAXIMUM RUNTIME",
DECIMAL(QQAVGT/1000,18,3) as "AVERAGE RUNTIME",
DECIMAL(QQMINT/1000,18,3) as "MINIMUM RUNTIME",
DECIMAL(QQOPNT/1000,18,3) as "MAXIMUM OPEN TIME",
DECIMAL(QQFETT/1000,18,3) as "MAXIMUM FETCH TIME ",
DECIMAL(QQCLST/1000,18,3) as "MAXIMUM CLOSE TIME",
DECIMAL(QQOTHT/1000,18,3) as "MAXIMUM OTHER TIME ",
QQMETU as "MOST EXPENSIVE USE",
QQLTU as "LAST USE",

/* ステートメント ID */
CASE qqstop
WHEN 'AL' THEN 'ALTER TABLE'
WHEN 'AQ' THEN 'ALTER SEQUENCE'
WHEN 'CA' THEN 'CALL'
WHEN 'CC' THEN 'CREATE SCHEMA'
WHEN 'CD' THEN 'CREATE DISTINCT TYPE'
WHEN 'CF' THEN 'CREATE FUNCTION'
WHEN 'CG' THEN 'CREATE TRIGGER'
WHEN 'CI' THEN 'CREATE INDEX'
WHEN 'CL' THEN 'CLOSE'
WHEN 'CM' THEN 'COMMIT'
WHEN 'CN' THEN 'CONNECT'
WHEN 'CO' THEN 'COMMENT ON'
WHEN 'CP' THEN 'CREATE PROCEDURE'
WHEN 'CQ' THEN 'CREATE SEQUENCE'
WHEN 'CS' THEN 'CREATE ALIAS'
WHEN 'CT' THEN 'CREATE TABLE'
WHEN 'CV' THEN 'CREATE VIEW'
WHEN 'DC' THEN 'DECLARE CURSOR'
WHEN 'DD' THEN 'DELETE...DELETE'
WHEN 'DE' THEN 'DESCRIBE'
WHEN 'DF' THEN 'DELETE...FETCH'
WHEN 'DH' THEN 'DELETE...CLOSE (ハード)'
WHEN 'DI' THEN 'DISCONNECT'
WHEN 'DK' THEN 'DELETE...CLOSE'
WHEN 'DL' THEN 'DELETE'
WHEN 'DM' THEN 'DESCRIBE INPUT'
WHEN 'DP' THEN 'DECLARE PROCEDURE'
WHEN 'DR' THEN 'DROP'
WHEN 'DT' THEN 'DESCRIBE TABLE'
WHEN 'DU' THEN 'DELETE...UPDATE'
WHEN 'EI' THEN 'EXECUTE IMMEDIATE'
WHEN 'EX' THEN 'EXECUTE'
WHEN 'FC' THEN 'FETCH...CLOSE'
WHEN 'FD' THEN 'FETCH...DELETE'
WHEN 'FE' THEN 'FETCH'
WHEN 'FF' THEN 'FETCH...FETCH'
WHEN 'FH' THEN 'FETCH...CLOSE (ハード)'
WHEN 'FL' THEN 'FREE LOCATOR'
WHEN 'FU' THEN 'FETCH...UPDATE'
WHEN 'GD' THEN 'GET DIAGNOSTICS'
WHEN 'GR' THEN 'GRANT'
WHEN 'HC' THEN 'CLOSE (ハード)'
WHEN 'HL' THEN 'HOLD LOCATOR'
WHEN 'IC' THEN 'INSERT'
WHEN 'IN' THEN 'INSERT'
WHEN 'JR' THEN '事前開始ジョブのリサイクル'
WHEN 'LK' THEN 'LOCK'
WHEN 'LO' THEN 'LABEL ON'
WHEN 'OC' THEN 'OPEN...CLOSE'
WHEN 'OD' THEN 'OPEN...DELETE'
WHEN 'OF' THEN 'OPEN...FETCH'
WHEN 'OH' THEN 'OPEN...CLOSE (ハード)'
WHEN 'OO' THEN 'OPEN'
WHEN 'OP' THEN 'OPEN'
WHEN 'OU' THEN 'OPEN...UPDATE'
WHEN 'PD' THEN 'PREPARE...DESCRIBE'
WHEN 'PR' THEN 'PREPARE'
WHEN 'RB' THEN 'ROLLBACK SAVEPOINT'
WHEN 'RE' THEN 'RELEASE'
WHEN 'RF' THEN 'REFRESH TABLE'
WHEN 'RG' THEN 'RESIGNAL'
WHEN 'RO' THEN 'ROLLBACK'
WHEN 'RS' THEN 'RELEASE SAVEPOINT'
WHEN 'RT' THEN 'RENAME'
WHEN 'RV' THEN 'REVOKE'
WHEN 'SA' THEN 'SAVEPOINT'
WHEN 'SC' THEN 'SET CONNECTION'
WHEN 'SE' THEN 'SET ENCRYPTION PASSWORD'
WHEN 'SG' THEN 'SIGNAL'
WHEN 'SI' THEN 'SELECT INTO'
WHEN 'SK' THEN 'SELECT INTO'
WHEN 'SP' THEN 'SET PATH'
WHEN 'SR' THEN 'SET RESULTS'
WHEN 'SS' THEN 'SET CURRENT SCHEMA'
WHEN 'ST' THEN 'SET TRANSACTION'
WHEN 'SV' THEN 'SET VARIABLE'
WHEN 'UC' THEN 'UPDATE...CLOSE'
WHEN 'UD' THEN 'UPDATE...DELETE'
WHEN 'UF' THEN 'UPDATE...FETCH'
WHEN 'UH' THEN 'UPDATE...CLOSE (ハード)'
WHEN 'UP' THEN 'UPDATE'
WHEN 'UU' THEN 'UPDATE...UPDATE'
WHEN 'VI' THEN 'VALUES INTO'
WHEN 'VV' THEN 'VALUES INTO'
ELSE qqstop
END AS "OPERATION",

QQCNT as "STATEMENT USAGE COUNT ",
varchar(b.qqsttx,20000) as "STATEMENT TEXT",
varchar(qqhvar,500) as "HOST VARIABLE VALUES",

/* OPENS */
QQFULO as "FULL OPENS",
QQPSUO as "PSEUDO OPENS",

/* 行サイズ */
a.QQTOTR as "TABLE ROWS",
QQRROW as "RESULT ROWS",
QQARSS as "AVERAGE RESULT SIZE",

/* 実装 */
CASE QQODPI
WHEN 'R' THEN '再利用可能'
WHEN 'N' THEN '再使用不可'
ELSE QQODPI
END as "ODP IMPLEMENTATION",

CASE QQHVI
WHEN 'I' THEN 'ISV'
WHEN 'V' THEN 'V2'
WHEN 'U' THEN 'UP'
ELSE QQHVI
END as "HOST VARIABLE IMPLEMENTATION",

CASE QQDACV
WHEN 'N' THEN NULL
WHEN '0' THEN NULL
WHEN '1' THEN '異なる長さ'
WHEN '2' THEN '異なる数値タイプ'
WHEN '3' THEN 'C NUL で終了する変数'
WHEN '4' THEN '可変長 固定長'
WHEN '5' THEN 'CCSID 変換'
WHEN '6' THEN 'DRDA マッピングが必要'
WHEN '7' THEN '日時カラム'
WHEN '8' THEN 'ホスト変数が多すぎます'
WHEN '9' THEN 'ターゲット・テーブルは SQL テーブルではありません'
ELSE QQDACV
END as "DATA CONVERSION",
QQCTS as "TABLE SCAN COUNT",

/* 索引情報 */
QQCIU as "INDEX USE COUNT",
QQCIC as "INDEX CREATE COUNT",
QQCIA as "INDEX ADVISED COUNT",
/* データのコピー */
QQCTF as "TEMPORARY TABLE COUNT",
QQCSO as "SORT COUNT",

/* ACCESS PLAN REBUILD */
CASE LEFT(QQAPR, 2)
WHEN 'A1' THEN CHAR('参照テーブルの変更')
WHEN 'A2' THEN CHAR('再使用可能ODP使用のため。再使用不可を選択(A2)')
WHEN 'A3' THEN CHAR('再使用不可ODP使用のため。再使用可能を選択(A3)')
WHEN 'A4' THEN CHAR('最終使用から10%以上の変更')
WHEN 'A5' THEN CHAR('新規索引が存在')
WHEN 'A6' THEN CHAR('使用索引の削除もしくは変更')
WHEN 'A7' THEN CHAR('システム・プログラミング変更(A7)')
WHEN 'A8' THEN CHAR('異なるCCSID')
WHEN 'A9' THEN CHAR('ジョブ実行値の変更(日付/時刻)')
WHEN 'AA' THEN CHAR('分類順序テーブル')
WHEN 'AB' THEN CHAR('プールもしくはDEGREEの変更')
WHEN 'AC' THEN CHAR('DB2 SMP機能の導入か削除')
WHEN 'AD' THEN CHAR('DEGREEの変更')
WHEN 'AE' THEN CHAR('ビューの実体化')
WHEN 'AF' THEN CHAR('順序・UDF・関数・SQLパスの変更(AF)')
WHEN 'B0' THEN CHAR('オプションの変更(QAQQINI)')
WHEN 'B1' THEN CHAR('異なるコミットメント制御レベル')
WHEN 'B2' THEN CHAR('静的カーソル応答セットの変更')
WHEN 'B3' THEN CHAR('実パラメーター・マーカー値で最初の実行')
WHEN 'B4' THEN CHAR('参照制約または検査制約の変更')
WHEN 'B5' THEN CHAR('実体化照会テーブルの変更')
ELSE QQAPR
END as "ACCESS PLAN REBUILD",

QQCAPR as "ACCESS PLAN REBUILD COUNT",
QQAPRT as "LAST ACCESS PLAN REBUILT",
/* ジョブ・ユーザー・プログラム ID */
QQJOB as "JOB",
QQUSER as "JOB USER",
QQJNUM as "JOB NUMBER",
QQTHID as "THREAD ID",
QQPLIB as "PROGRAM LIBRARY",
QQPNAM as "PROGRAM",

/* ステートメント属性 */
QQUDEF as "USER DEFINED FIELD",
QQCNAM as "CURSOR",
QQSNAM as "STATEMENT NAME"

FROM IBMDXCDATA.SQMSMRYAT0 a left join IBMDXCDATA.SQMTEXTAT0 b on a.QQKEY=b.QQKEY
left join IBMDXCDATA.SQM3010AT0 c on a.QQKEY=c.QQKEY
JOIN IBMDXCDATA.SQM3003AT0 d on a.QQKEY=d.QQKEY

WHERE QQCSO > 0

ORDER BY "SORT TIME" DESC

[Top Pageに戻る]

Ads by TOK2