OracleデータベースのV$SHARED_POOL_RESERVED動的パフォーマンスビュー解説

V$SHARED_POOL_RESERVED の概要と目的

V$SHARED_POOL_RESERVED は Oracle データベースにおける動的パフォーマンスビューの一つで、共有プール内に設けられた「予約領域(Reserved Area)」のメモリ使用状況を監視するための情報を提供します。

この領域は、比較的大きなメモリ要求(例:大規模なPL/SQLブロックや複雑なSQL文)を処理するために確保されており、主な目的は以下の通りです:

  • 共有プールの断片化により発生する ORA-04031 エラーを回避
  • 大規模オブジェクトの割り当てをメイン共有プールから分離し、断片化を抑制
  • 連続した大容量メモリの割り当て効率を向上

通常、_SHARED_POOL_RESERVED_MIN_ALLOC(デフォルト4400バイト)を超えるメモリ要求は、まずこの予約領域で処理が試みられます。

主要カラムの詳細

カラム名 データ型 説明
FREE_SPACE NUMBER 予約領域内の未使用メモリ量(バイト単位)
AVG_FREE_SIZE NUMBER 空きメモリブロックの平均サイズ
FREE_COUNT NUMBER 空きメモリブロック数
MAX_FREE_SIZE NUMBER 最大の連続空きメモリブロックサイズ。割り当て可能上限を示す重要な指標
USED_SPACE NUMBER 現在使用中のメモリ量
AVG_USED_SIZE NUMBER 使用中メモリブロックの平均サイズ
USED_COUNT NUMBER 使用中のメモリブロック数
MAX_USED_SIZE NUMBER 過去に割り当てられた最大メモリブロックサイズ
REQUEST_FAILURES NUMBER 連続メモリ不足により失敗した割り当て回数。増加傾向ならサイズ見直しが必要
LAST_FAILURE_SIZE NUMBER 最後に失敗した要求のサイズ
REQUEST_MISSES NUMBER 予約領域内で十分な空きが見つからなかった回数(メイン共有プールで後続処理される場合あり)
LAST_MISS_SIZE NUMBER 最後にミスした要求のサイズ
CON_ID NUMBER マルチテナント環境(CDB)におけるコンテナID。非CDBでは0

典型的な利用シーン

  • ORA-04031 エラーの根本原因分析
  • SHARED_POOL_RESERVED_SIZE パラメータのチューニング判断
  • 大規模メモリオブジェクトの使用傾向把握
  • 共有プール関連のパフォーマンス問題の診断

内部動作と関連パラメータ

予約領域は共有プールの一部ですが、独立したLRUリストで管理されます。割り当て要求が失敗した場合、Oracleはメイン共有プールでの再試行を行います。

主な関連パラメータ:

  • SHARED_POOL_RESERVED_SIZE:予約領域のサイズ(推奨値:共有プール全体の5~10%)
  • _SHARED_POOL_RESERVED_MIN_ALLOC:予約領域を利用する最小割り当てサイズ(隠しパラメータ、デフォルト4400バイト)

関連する他の動的ビュー

  • V$SGASTAT:SGA構成の詳細統計
  • V$LIBRARYCACHE:ライブラリキャッシュのヒット率・再読込情報
  • V$SQLAREA:SQLカーソルのメモリ使用量
  • V$DB_OBJECT_CACHE:キャッシュされたPL/SQLオブジェクト情報

実用的なクエリ例

予約領域の基本状況確認

SELECT 
    ROUND(free_space / 1048576, 2) AS free_mb,
    ROUND(max_free_size / 1024, 2) AS max_free_kb,
    ROUND(used_space / 1048576, 2) AS used_mb,
    request_failures,
    ROUND(last_failure_size / 1024, 2) AS last_fail_kb
FROM v$shared_pool_reserved;

異常検出用簡易チェック

SELECT 
    request_failures,
    CASE 
        WHEN request_failures > 0 THEN 'ALERT: Allocation failures detected'
        ELSE 'OK'
    END AS health_status
FROM v$shared_pool_reserved;

予約領域とメイン共有プールの比較

WITH reserved AS (
    SELECT 
        used_space + free_space AS total_reserved,
        used_space AS used_reserved
    FROM v$shared_pool_reserved
),
main_pool AS (
    SELECT 
        SUM(bytes) AS used_main
    FROM v$sgastat
    WHERE pool = 'shared pool'
      AND name NOT IN ('free memory', 'reserved pool')
)
SELECT 
    'Reserved' AS area,
    ROUND(r.used_reserved / 1048576, 2) AS used_mb,
    ROUND(r.total_reserved / 1048576, 2) AS total_mb
FROM reserved r
UNION ALL
SELECT 
    'Main Shared Pool',
    ROUND(m.used_main / 1048576, 2),
    (SELECT ROUND(value / 1048576, 2) 
     FROM v$parameter 
     WHERE name = 'shared_pool_size')
FROM main_pool m;

運用上のベストプラクティス

  • 予約領域サイズは過剰にせず、実際の MAX_USED_SIZE を基準に設定
  • REQUEST_FAILURES が継続的に増加する場合はサイズ拡張を検討
  • アプリケーション側で大規模PL/SQLの分割やSQLの最適化も併せて実施
  • CDB環境では各PDBごとに負荷特性を評価し、必要に応じて個別調整

タグ: Oracle V$SHARED_POOL_RESERVED SGA 共有プール ORA-04031

8月8日 04:13 投稿