記憶域常駐データベース・モニター (基本ステートメント情報)

こちらでツールを紹介したメモリー常駐型 DB モニターですが、どういう情報が取得できるか、その取得の仕方などなどをちょっと紹介してみたいと思います。

iSeries ナビゲーターの「データベース」-「SQL パフォーマンス・モニター」画面から右クリックメニューで「分析」と選択すると、↓のようなダイアログ・ボックスが出てくると思います。

この一連の画面のチェックボックスで選択できるタイプの情報はそのままツールで取得したデータに対しても使用できます。

チェックボックスにチェックを入れると「選択された Query の変更」ボタンがアクティブになります。
その「選択された Query の変更」ボタンを押すと「SQL スクリプトの実行」画面が出てきて、該当の情報を抽出するための SQL が表示されますので、その SQL の FROM 部分で取得データのライブラリーとファイル名を指定してやればいいわけです。

通常の「要約」モニターで取得したファイルの場合、QPM00000XX といった名前のファイルになっていますが、この XX の部分を読み替えてやればそのまま使用できます。
たとえば QPM0000001 の場合は SQM3001ATx、QPM0000010 の場合は SQM3010ATx という形で読み替えれば OK です。
もともとインフォメーション・センターに載っているファイルフォーマットの名前に則っているのでそんなに難しくないでしょう。

インフォメーション・センターに載っていない番号のもの、QPM0000018 と QPM0000019 に関してはそれぞれ SQMSMRYATx、SQMTEXTATx に相当します。

FROM QGPL.QPM0000018 a left join QGPL.QPM0000019 b on a.qqkey=b.qqkey
left join QGPL.QPM0000010 c on a.qqkey=c.qqkey

は↓のようになるわけです。

FROM IBMDXCDATA.SQMSMRYAT0 a left join IBMDXCDATA.SQMTEXTAT0 b on a.qqkey=b.qqkey
left join IBMDXCDATA.SQM3010AT0 c on a.qqkey=c.qqkey

「一般要約」をチェックした場合の全文です。

SELECT

/* データベース・パフォーマンス・モニター基本ステートメント情報 */

/* TIME */
a.QQTIME as "TIME",

/* 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",

/* 行サイズ */
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 */
QQAPRT as "LAST ACCESS PLAN REBUILT",
QQCAPR as "ACCESS PLAN REBUILD COUNT",

CASE QQAPR
WHEN 'A1' THEN '異なるファイルまたはメンバー'
WHEN 'A2' THEN '再使用可能計画を再使用不可計画に変更'
WHEN 'A3' THEN '再使用不可計画を再使用可能計画に変更'
WHEN 'A4' THEN '変更が行数にして 10 % を超えます'
WHEN 'A5' THEN '新しいアクセス・パスが見つかりました'
WHEN 'A6' THEN 'アクセス・パスがもはや見つからないかまたは無効'
WHEN 'A7' THEN 'システム・プログラミング変更'
WHEN 'A8' THEN '異なる CCSID'
WHEN 'A9' THEN '異なる日付または時刻形式'
WHEN 'AA' THEN '異なるソート順序テーブル'
WHEN 'AB' THEN '別の記憶域プールまたはページング・オプション'
WHEN 'AC' THEN 'シンメトリック・マルチプロセッシング変更'
WHEN 'AD' THEN '異なる DEGREE'
WHEN 'AE' THEN 'ビューまたはビューの具体化を開く'
WHEN 'AF' THEN 'UDF または UDT 変更'
WHEN 'B0' THEN 'QAQQINI 変更'
WHEN 'B1' THEN '異なる分離レベルおよびスクロール・オプション'
WHEN 'B2' THEN '異なる FETCH FIRST n ROWS'
WHEN 'B3' THEN '可変値による最初の実行'
WHEN 'B4' THEN '異なる制約'
WHEN 'NR' THEN '新規リリース'
ELSE QQAPR
END AS "ACCESS PLAN REBUILD REASON",

/* ジョブ・ユーザー・プログラム 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

ORDER BY "MAXIMUM RUNTIME" DESC

これを実行すると、たとえば以下のような情報が取得できます。

それぞれ各 SQL 文毎の行になっています。
最大実行時間、平均実行時間、最も速かった時の実行時間、オープンにかかった最大時間、フェッチにかかった最大時間、クローズにかかった最大時間など、わざわざ「詳細」モニターを取ってから集計して出していたりしかねないデータがそのまま出てきます。

このショットでは省略していますが左側に実行されたタイムスタンプが載っていて、それは最大実行時間の時の時間になっています。
SQL 文と実行時間がわかれば、ピーク時の判断やその時にどんな業務が実行されているか、などもわかりますね。

さらに、時間のかかっているオペレーションは何か、該当 SQL が何回実行されたか、などもわかります。

該当 SQL でテーブル・スキャンは何回行われたか、インデックスの使用回数、一時インデックスが作られた場合はその作成回数、インデックスが推奨された回数、一時テーブルの使用数、ソートの行われた回数なども集計された状態でわかります。

さらに、アクセス・プランが再作成された場合はその回数と理由もわかります。
また、最大実行時間時のジョブも特定できるようになっています。

実際にこのメモリー常駐型モニターをかけてみると、システムにかかる負荷も収集データのデータ量も桁違いに「詳細」モニターに比較すると軽くなっています。
まずは予防保守的なアプローチとして、このメモリー常駐型モニターをシステムでサイクリックに常時 (ピーク日、ピーク時などを選んでもいいですが、比較対象も必要になります) かけることをお勧めしますね。Oracle ではモニターをかけてないシステムなんて考えられないと思いますし ......

[Top Pageに戻る]

Ads by TOK2