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ごとに負荷特性を評価し、必要に応じて個別調整