タイトル: ラージプール
SEOタイトル: Oracle Large Pool (ラージプール) 完全ガイド
| この記事の要点 |
|
SGA における Large Pool の位置づけ
Oracle の SGA (System Global Area) は複数のメモリ領域から構成されます:
| 領域 | 役割 |
|---|---|
| Database Buffer Cache | 表 / 索引のブロックをキャッシュ |
| Shared Pool | SQL の構文解析結果・実行計画・データ・ディクショナリキャッシュ |
| Redo Log Buffer | REDO レコードのバッファ。LGWR が REDO ファイルへ書く |
| Large Pool | 大きい連続メモリが必要な処理用(任意) |
| Java Pool | Java VM 用 |
| Streams Pool | Streams / GoldenGate 用バッファ |
Large Pool の主な用途
| 用途 | 説明 | 関連パラメータ |
|---|---|---|
| RMAN バックアップ / リカバリ | 並列バックアップのスレーブ用バッファ、ディスク I/O バッファ | BACKUP_TAPE_IO_SLAVES |
| 並列クエリ実行 | 並列スレーブ間のメッセージバッファ | PARALLEL_* |
| 共有サーバー (MTS) | UGA(ユーザーグローバル領域)の格納 | DISPATCHERS |
| Data Pump (expdp/impdp) | パイプ・キューバッファ | — |
| I/O Slave 処理 | 非同期 I/O 不可な環境でのスレーブ I/O | DBWR_IO_SLAVES |
Shared Pool との違い
| 項目 | Shared Pool | Large Pool |
|---|---|---|
| 確保単位 | 小〜中(4KB〜数十KB) | 大(数百KB〜数MB) |
| LRU 管理 | あり(古いものから破棄) | なし |
| 断片化 | 起きやすい (ORA-4031 の原因) | 起きにくい |
| 主な内容 | SQL 解析結果・実行計画 | UGA / RMAN バッファ等 |
| 必須か | 必須 | 用途により任意 |
RMAN や並列クエリの大きなメモリ要求を Shared Pool から取ろうとすると、Shared Pool が断片化して ORA-4031(共有プールに空きがない)が出ることがあります。これを避けるため Large Pool を専用に確保します。
Large Pool のサイズ設定
-- 現在のサイズ確認
SHOW PARAMETER large_pool_size;
-- 個別サイズで明示指定(手動メモリ管理)
ALTER SYSTEM SET large_pool_size = 256M SCOPE = BOTH;
-- AMM(Automatic Memory Management)有効時は自動調整
SHOW PARAMETER memory_target; -- 0 でない = AMM 有効
SHOW PARAMETER memory_max_target;
-- ASMM(Automatic Shared Memory Management)
SHOW PARAMETER sga_target; -- 0 でない = ASMM 有効
SHOW PARAMETER sga_max_size;
-- ASMM 配下でも下限を保証したい場合
ALTER SYSTEM SET large_pool_size = 128M SCOPE = BOTH; -- 最低 128M を確保
-- 11g 以降は手動指定しなくても、ASMM/AMM が必要時にサイズを動的に増減
現在の状態を確認するビュー
-- SGA 全体の構成
SELECT name, value/1024/1024 AS mb
FROM v$sga;
-- NAME MB
-- Fixed Size 8
-- Variable Size 1024
-- Database Buffers 2048
-- Redo Buffers 16
-- 動的コンポーネント別のサイズ
SELECT component, current_size/1024/1024 AS current_mb,
min_size/1024/1024 AS min_mb,
max_size/1024/1024 AS max_mb
FROM v$sga_dynamic_components
WHERE component LIKE '%pool%';
-- Large Pool 内部の利用状況
SELECT pool, name, bytes/1024/1024 AS mb
FROM v$sgastat
WHERE pool = 'large pool';
-- POOL NAME MB
-- large pool free memory 120
-- large pool PX msg pool 2
-- large pool KGH: NO ACCESS 8
RMAN で Large Pool が使われる例
-- I/O スレーブを使う設定(テープ装置等で有効)
ALTER SYSTEM SET BACKUP_TAPE_IO_SLAVES = TRUE SCOPE = SPFILE;
ALTER SYSTEM SET LARGE_POOL_SIZE = 256M SCOPE = SPFILE;
-- 並列度を設定して RMAN バックアップ
-- RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 4;
-- RMAN> BACKUP DATABASE PLUS ARCHIVELOG;
-- バックアップ実行中の Large Pool 利用確認
SELECT pool, name, bytes/1024 AS kb
FROM v$sgastat
WHERE pool = 'large pool' AND name LIKE '%KSFQ%';
-- KSFQ = RMAN Sequential I/O Buffer
並列クエリで Large Pool が使われる例
-- 並列度を設定
ALTER SYSTEM SET PARALLEL_MAX_SERVERS = 32;
ALTER SYSTEM SET PARALLEL_MIN_SERVERS = 4;
-- 並列実行のヒント付きクエリ
SELECT /*+ PARALLEL(emp, 8) */ COUNT(*) FROM emp_billion;
-- 並列スレーブのメッセージバッファ確認
SELECT pool, name, bytes/1024 AS kb
FROM v$sgastat
WHERE pool = 'large pool' AND name LIKE '%PX%';
-- PX msg pool : Parallel eXecution メッセージ用
ORA-4031 と Large Pool の関係
OLTP + バッチ並行運用の本番でORA-04031: unable to allocate ... bytes of shared memoryが出る場合、Shared Pool 内で巨大連続領域を要求して断片化が原因のことが多いです:
-- 1. Large Pool を明示確保して逃がす
ALTER SYSTEM SET LARGE_POOL_SIZE = 256M;
-- 2. UGA を Large Pool に逃がす(共有サーバー時)
-- 自動的に Large Pool へ確保される
-- 3. Shared Pool の断片化解消(緊急対応)
ALTER SYSTEM FLUSH SHARED_POOL;
-- ★ 本番では SQL 計画キャッシュも消えるので注意。再ハードパースで CPU 跳ね上がる
サイズ見積もりの目安
| 用途 | 推奨サイズ |
|---|---|
| 小規模・RMAN のみ | 64M〜128M |
| 並列クエリ多用 | 256M〜512M |
| 共有サーバー + UGA 大 | 同時セッション × UGA 平均サイズ × 1.5 |
| 大規模 OLAP / DWH | 1G 以上、SGA_TARGET の 10〜20% |
AMM / ASMM 有効時はサイズを直接指定する必要はほぼありません。AWR レポートで Large Pool が圧迫されているなら下限を LARGE_POOL_SIZE で明示する程度です。
FAQ
Q: Large Pool を 0 にしたらどうなる?
A: 用途は Shared Pool で代用されますが、断片化リスクが上がります。並列クエリ・RMAN・MTS のいずれかを使うなら 64M 以上は確保しましょう。
Q: AMM と ASMM どちらが良い?
A: 11g 以降は AMM (memory_target) が手軽ですが、大規模本番では ASMM (sga_target + pga_aggregate_target) の方が予測性が高く推奨されます。
Q: AWR で Large Pool の使用率を見たい
A: AWR レポートの「Memory Statistics」セクションに current_size / target_size が出ます。v$sga_resize_ops でリサイズ履歴も確認可能です。