MON_GET_* 関数の概要と特徴
MON_GET_* は DB2 V9.7 で導入された SQL ベースのモニタリング・テーブル関数群です。SELECT 文の FROM 句にテーブル関数として記述し、WHERE・ORDER BY・GROUP BY で柔軟に加工できます。Oracle AWR に最も近い使い勝手を提供する現代的な手法です。
主な特徴
- SQL の構文で取得・加工・集計が可能
- 複数関数を JOIN して複合レポートが作れる
- 定期的にテーブルに INSERT すれば差分分析・トレンド分析が可能
- モニタースイッチが不要(一部は DBM CFG の設定が必要)
- スクリプト化・自動化に適している
実行権限
SYSADM / SYSCTRL / SYSMAINT / SYSMON、または個別に EXECUTE 権限が付与されたユーザが実行できます。
主要関数一覧
| 関数名 | 取得情報 | Oracle AWR 対応 |
|---|---|---|
| MON_GET_DATABASE | データベース全体の累積統計 | Report Summary / Instance Activity |
| MON_GET_WORKLOAD | ワークロード単位の統計(接続・SQL・待機) | Wait Events Statistics / Load Profile |
| MON_GET_PKG_CACHE_STMT | パッケージキャッシュ内の SQL 統計 | SQL Statistics(Top SQL ランキング相当) |
| MON_GET_BUFFERPOOL | バッファプール統計 | Buffer Pool Statistics |
| MON_GET_TABLESPACE | テーブルスペース統計(I/O・使用率) | IO Stats(Tablespace) |
| MON_GET_TABLE | テーブル単位のアクセス統計 | Segment Statistics |
| MON_GET_MEMORY_POOL | メモリプール使用状況 | Memory Statistics / SGA |
| MON_GET_LOCKS | ロック保有・待機情報 | Wait Statistics / Enqueue Activity |
| MON_GET_UNIT_OF_WORK | アクティブな作業単位(トランザクション)情報 | Instance Activity Statistics |
| MON_GET_CONNECTION | 接続単位の統計 | Report Summary(接続情報) |
セクション定義表
① MON_GET_DATABASE — データベース統計
Oracle AWR の Report Summary / Instance Activity Statistics に相当します。
| 列名 | 何を表すか | 読み方・異常値の目安 |
|---|---|---|
| DB_STATUS | データベースの現在の状態 | ACTIVE 以外は要確認 |
| TOTAL_APP_COMMITS | コミット回数(累積) | トランザクションスループットの基本指標 |
| TOTAL_APP_ROLLBACKS | ロールバック回数(累積) | コミットに対するロールバック率 5% 超は要調査 |
| DEADLOCKS | デッドロック発生回数(累積) | 1以上で Event Monitor による詳細調査を実施 |
| LOCK_ESCALS | ロックエスカレーション回数(累積) | 頻発時は LOCKLIST / MAXLOCKS の見直し |
| TOTAL_SORTS | ソート実行回数(累積) | SORT_OVERFLOWS との比率でオーバーフロー率を算出 |
| SORT_OVERFLOWS | 一時領域へのソートスピル回数 | TOTAL_SORTS の 5% 超で SORTHEAP 増加を検討 |
| ROWS_READ | 読み取り行数(累積) | ROWS_RETURNED との比率(フィルタ率)で非効率スキャンを検出 |
| LOG_USED_TOP | ログ使用量のハイウォーターマーク(バイト) | LOG_SPACE_USED との比較でログ枯渇リスクを評価 |
② MON_GET_PKG_CACHE_STMT — SQL 統計
Oracle AWR の SQL Statistics(Top SQL)に相当します。パッケージキャッシュ内の SQL ごとの統計を取得します。
| 列名 | 何を表すか | 読み方・異常値の目安 |
|---|---|---|
| STMT_TEXT | SQL テキスト | 原因 SQL の特定に使用。LIKE 条件でフィルタ可能 |
| NUM_EXECUTIONS | 実行回数(累積) | 頻繁に実行される SQL の特定。Oracle の Executions に相当 |
| TOTAL_EXEC_TIME | 累積実行時間(ミリ秒) | NUM_EXECUTIONS で割ると平均応答時間。Oracle の Elapsed Time に相当 |
| TOTAL_CPU_TIME | 累積 CPU 消費時間(マイクロ秒) | CPU バウンドな SQL の特定。Oracle の CPU Time に相当 |
| ROWS_READ | 読み取り行数(累積) | ROWS_RETURNED との比でフィルタ率を確認 |
| TOTAL_SORTS | このSQL のソート実行回数(累積) | 高い場合は実行計画・インデックス・SORTHEAP を確認 |
| POOL_DATA_L_READS | 論理読み込み回数(累積) | Oracle の Buffer Gets に相当 |
| POOL_DATA_P_READS | 物理読み込み回数(累積) | Oracle の Disk Reads に相当。高い場合はバッファプール不足 |
| STMT_TYPE_ID | SQL の種類(SELECT / INSERT / UPDATE / DELETE 等) | DML の割合分析に使用 |
③ MON_GET_BUFFERPOOL — バッファプール統計
Oracle AWR の Buffer Pool Statistics に相当します。
| 列名 | 何を表すか | 読み方・異常値の目安 |
|---|---|---|
| BP_NAME | バッファプール名 | 複数バッファプール構成の場合は個別に確認 |
| POOL_DATA_L_READS | データページの論理読み込み回数 | ヒット率の分母 |
| POOL_DATA_P_READS | データページの物理読み込み回数 | ヒット率 = 1 - (P_READS / L_READS)。90%未満は要注意 |
| POOL_IDX_L_READS | インデックスページの論理読み込み回数 | インデックスヒット率の算出に使用 |
| POOL_IDX_P_READS | インデックスページの物理読み込み回数 | インデックスヒット率が低い場合は BP サイズ増加を検討 |
| POOL_ASYNC_DATA_READS | 非同期プリフェッチの読み込みページ数 | POOL_DATA_P_READS の大半を占めるのが理想 |
| BP_PAGES_LEFT_TO_REMOVE | 削除待ちのページ数 | 大きい場合はバッファプールのサイズ調整中を示す |
④ MON_GET_TABLESPACE — テーブルスペース統計
Oracle AWR の IO Stats(Tablespace)に相当します。
| 列名 | 何を表すか | 読み方・異常値の目安 |
|---|---|---|
| TBSP_NAME | テーブルスペース名 | SYSCATSPACE は常に確認対象 |
| TBSP_STATE | 状態 | NORMAL 以外は即時確認 |
| TBSP_USED_PAGES | 使用済みページ数 | TBSP_USABLE_PAGES の 90% 超で拡張を検討 |
| TBSP_FREE_PAGES | 空きページ数 | 0 に近づくと書き込みエラーが発生する |
| POOL_DATA_P_READS | このテーブルスペースへの物理読み込み回数 | I/O ホットスポットの特定に使用 |
| POOL_DATA_WRITES | このテーブルスペースへの書き込み回数 | 書き込み負荷の分析に使用 |
⑤ MON_GET_MEMORY_POOL — メモリ統計
Oracle AWR の Memory Statistics / SGA 詳細に相当します。
| 列名 | 何を表すか | 読み方・異常値の目安 |
|---|---|---|
| POOL_NAME | メモリプール名 | DBMS(インスタンス共有)/ DATABASE(DB固有)の区別が重要 |
| POOL_ID | プール ID | 同一名のプールを区別する場合に使用 |
| MEMORY_SET_SIZE | プールに割り当てられたメモリサイズ(バイト) | 現在の割り当てを把握 |
| MEMORY_SET_USED | 実際に使用中のメモリサイズ(バイト) | MEMORY_SET_SIZE に近い場合は上限設定の見直し |
| MEMORY_POOL_USED_HWM | ハイウォーターマーク(ピーク使用量) | 上限設定の 90% 超のピーク記録がある場合は増設を検討 |
取得 SQL 例
Top SQL by 累積実行時間
-- 実行時間の多い上位 10 SQL を取得(Oracle AWR の Top SQL by Elapsed Time 相当)
SELECT
SUBSTR(STMT_TEXT, 1, 100) AS SQL_TEXT,
NUM_EXECUTIONS AS EXEC_COUNT,
TOTAL_EXEC_TIME / 1000 AS TOTAL_EXEC_SEC,
TOTAL_EXEC_TIME / NULLIF(NUM_EXECUTIONS, 0) / 1000 AS AVG_EXEC_SEC,
TOTAL_CPU_TIME / 1000 AS TOTAL_CPU_SEC,
POOL_DATA_L_READS AS LOGICAL_READS,
POOL_DATA_P_READS AS PHYSICAL_READS
FROM TABLE(MON_GET_PKG_CACHE_STMT(NULL, NULL, NULL, -2))
WHERE NUM_EXECUTIONS > 0
ORDER BY TOTAL_EXEC_TIME DESC
FETCH FIRST 10 ROWS ONLY;
バッファプールヒット率の確認
-- バッファプールごとのヒット率を算出(Oracle AWR の Buffer Pool Statistics 相当)
SELECT
BP_NAME,
POOL_DATA_L_READS,
POOL_DATA_P_READS,
CASE WHEN POOL_DATA_L_READS > 0
THEN CAST((1.0 - CAST(POOL_DATA_P_READS AS DECIMAL(18,2)) / POOL_DATA_L_READS) * 100 AS DECIMAL(5,2))
ELSE 100.00
END AS DATA_HIT_RATIO_PCT,
POOL_IDX_L_READS,
POOL_IDX_P_READS,
CASE WHEN POOL_IDX_L_READS > 0
THEN CAST((1.0 - CAST(POOL_IDX_P_READS AS DECIMAL(18,2)) / POOL_IDX_L_READS) * 100 AS DECIMAL(5,2))
ELSE 100.00
END AS IDX_HIT_RATIO_PCT
FROM TABLE(MON_GET_BUFFERPOOL(NULL, -2))
ORDER BY BP_NAME;
データベース全体の統計確認
-- データベース全体の主要統計(Oracle AWR の Report Summary 相当)
SELECT
DB_STATUS,
TOTAL_APP_COMMITS,
TOTAL_APP_ROLLBACKS,
DEADLOCKS,
LOCK_ESCALS,
TOTAL_SORTS,
SORT_OVERFLOWS,
CASE WHEN TOTAL_SORTS > 0
THEN CAST(SORT_OVERFLOWS * 100.0 / TOTAL_SORTS AS DECIMAL(5,2))
ELSE 0.00
END AS SORT_OVERFLOW_RATIO_PCT
FROM TABLE(MON_GET_DATABASE(-2));
テーブルスペース使用率の確認
-- テーブルスペース使用率の確認(Oracle AWR の IO Stats Tablespace 相当)
SELECT
TBSP_NAME,
TBSP_STATE,
TBSP_USABLE_PAGES,
TBSP_USED_PAGES,
CAST(TBSP_USED_PAGES * 100.0 / NULLIF(TBSP_USABLE_PAGES, 0) AS DECIMAL(5,2)) AS USED_PCT,
POOL_DATA_P_READS AS PHYS_READS,
POOL_DATA_WRITES AS WRITES
FROM TABLE(MON_GET_TABLESPACE(NULL, -2))
ORDER BY USED_PCT DESC;
差分分析パターン
Oracle AWR の「2スナップショット間の差分」に相当する分析を MON_GET_* で実現するには、定期的にスナップショットをテーブルに保存して比較します。
スナップショット保存テーブルの作成
-- スナップショット格納テーブルの作成例
CREATE TABLE PERF_SNAP_DATABASE (
SNAP_TIME TIMESTAMP NOT NULL,
TOTAL_APP_COMMITS BIGINT,
TOTAL_SORTS BIGINT,
SORT_OVERFLOWS BIGINT,
DEADLOCKS BIGINT,
ROWS_READ BIGINT,
ROWS_RETURNED BIGINT
);
-- スナップショットの挿入(定期バッチから実行)
INSERT INTO PERF_SNAP_DATABASE
SELECT
CURRENT TIMESTAMP,
TOTAL_APP_COMMITS,
TOTAL_SORTS,
SORT_OVERFLOWS,
DEADLOCKS,
ROWS_READ,
ROWS_RETURNED
FROM TABLE(MON_GET_DATABASE(-2));
差分の計算
-- 直近2スナップショット間の差分を確認
SELECT
T2.SNAP_TIME AS END_TIME,
T1.SNAP_TIME AS BEGIN_TIME,
T2.TOTAL_APP_COMMITS - T1.TOTAL_APP_COMMITS AS COMMITS_DELTA,
T2.DEADLOCKS - T1.DEADLOCKS AS DEADLOCKS_DELTA,
T2.SORT_OVERFLOWS - T1.SORT_OVERFLOWS AS SORT_OVF_DELTA
FROM PERF_SNAP_DATABASE T1
JOIN PERF_SNAP_DATABASE T2
ON T2.SNAP_TIME = (SELECT MAX(SNAP_TIME) FROM PERF_SNAP_DATABASE)
AND T1.SNAP_TIME = (SELECT MAX(SNAP_TIME) FROM PERF_SNAP_DATABASE
WHERE SNAP_TIME < T2.SNAP_TIME);
注意事項
- 引数の意味: 多くの関数は第1引数にデータベース名(NULL で現在のDB)、第2引数にメンバー番号(-2 で全メンバー、-1 で現在のメンバー)を取ります。DPF 環境では必ず確認してください。
- 累積値: MON_GET_* の多くの列は DB 起動時からの累積値です。差分分析には2時点取得と比較が必要です(上記の差分分析パターン参照)。
- MON_GET_PKG_CACHE_STMT のキャッシュ: SQL キャッシュが溢れると古いSQL情報が失われます。
CATALOGCACHE_SZ/PKGCACHESZの設定を確認してください。 - V9.7 未満の環境: MON_GET_* は DB2 V9.7 以降で使用可能です。それ以前の環境では GET SNAPSHOT(PART 03)を使用してください。
- 権限: 一部の関数(MON_GET_PKG_CACHE_STMT など)は SQLADM 権限または個別の EXECUTE 権限が必要です。DBADM 権限を持つユーザでも実行できます。