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 権限を持つユーザでも実行できます。