Oracle はメモリを SGA(System Global Area)とPGA(Program Global Area)の2つの領域で管理します。SGA はデータベース全体で共有するキャッシュ(バッファキャッシュ・共有プール・REDO ログバッファなど)を保持し、PGA は各サーバープロセスが個別に使用するメモリ(ソート領域・ハッシュ結合領域など)です。
Oracle 10g からは AMM(Automatic Memory Management)とASMM(Automatic Shared Memory Management)が導入され、多くの設定を自動化できるようになりました。この記事では設定方法・監視・チューニングまで実例で解説します。
この記事でわかること
- SGA と PGA の構成要素と役割
- AMM(MEMORY_TARGET)・ASMM(SGA_TARGET)・手動管理の違いと設定方法
- V$SGASTAT・V$SGA_DYNAMIC_COMPONENTS で SGA の内訳を確認する方法
- V$PGASTAT・V$PROCESS で PGA の使用状況を確認する方法
- メモリ関連パラメータの確認・変更方法
- ORA-04031(共有プール枯渇)の予防策
SGA の主要コンポーネント
| コンポーネント | 役割 | 主な設定パラメータ |
|---|---|---|
| Database Buffer Cache | データブロックのキャッシュ。ディスク I/O を削減する最重要領域 | DB_CACHE_SIZE |
| Shared Pool | SQL の実行計画・PL/SQL コード・データ辞書のキャッシュ | SHARED_POOL_SIZE |
| Redo Log Buffer | LGWR が書き込む前の REDO ログの一時保持領域 | LOG_BUFFER |
| Large Pool | Data Pump・RMAN・並列実行・共有サーバーが使用するメモリ | LARGE_POOL_SIZE |
| Java Pool | Java VM のメモリ領域(Java ストアドプロシージャを使う場合) | JAVA_POOL_SIZE |
| Streams Pool | Oracle Streams・GoldenGate などの変更キャプチャ用メモリ | STREAMS_POOL_SIZE |
メモリ管理モードの種類と設定
| 管理モード | パラメータ | 特徴 |
|---|---|---|
| AMM(自動メモリ管理) | MEMORY_TARGET / MEMORY_MAX_TARGET | SGA と PGA の合計上限を指定。Oracle がコンポーネントごとに自動調整。Linux の HugePages と併用不可 |
| ASMM(自動共有メモリ管理) | SGA_TARGET / PGA_AGGREGATE_TARGET | SGA の上限を指定してコンポーネントを自動調整。PGA は別途指定。HugePages と併用可能 |
| 手動管理 | 個別パラメータ(DB_CACHE_SIZE など) | 各コンポーネントを個別に設定。細かい制御が可能だが管理が煩雑 |
本番環境での推奨: ASMM + PGA_AGGREGATE_TARGET
Linux 本番環境では HugePages(大きなメモリページ)を使って SGA を固定するため AMM は使えません。ASMM(SGA_TARGET)+ PGA_AGGREGATE_TARGET の組み合わせが推奨です。
Linux 本番環境では HugePages(大きなメモリページ)を使って SGA を固定するため AMM は使えません。ASMM(SGA_TARGET)+ PGA_AGGREGATE_TARGET の組み合わせが推奨です。
現在のメモリ管理モードと設定値を確認する
-- 主要メモリパラメータを確認
SELECT name, value, description
FROM V$PARAMETER
WHERE name IN (
'memory_target',
'memory_max_target',
'sga_target',
'sga_max_size',
'pga_aggregate_target',
'pga_aggregate_limit',
'db_cache_size',
'shared_pool_size'
)
ORDER BY name;
-- memory_target > 0 → AMM モード
-- sga_target > 0、memory_target = 0 → ASMM モード
-- 両方 0 → 手動管理モード
メモリモードを ASMM に設定する(spfile に永続化)
-- SGA 合計を 4GB、PGA を 2GB に設定(ASMM モード) ALTER SYSTEM SET sga_target = 4G SCOPE=BOTH; ALTER SYSTEM SET sga_max_size = 4G SCOPE=SPFILE; -- sga_max_size は再起動が必要 ALTER SYSTEM SET pga_aggregate_target = 2G SCOPE=BOTH; -- AMM を無効化する(AMM から ASMM に切り替える場合) ALTER SYSTEM SET memory_target = 0 SCOPE=BOTH; -- 変更を確認 SHOW PARAMETER sga_target; SHOW PARAMETER pga_aggregate_target;
SGA の内訳を確認・監視する
V$SGASTAT で SGA コンポーネントの使用量を確認する
-- SGA の主要コンポーネントの使用量を確認
SELECT
pool, -- shared pool / large pool / java pool など
name, -- コンポーネント名
ROUND(bytes / 1024 / 1024, 2) AS mb
FROM V$SGASTAT
WHERE pool IS NOT NULL -- NULL は SGA 固定部分
ORDER BY bytes DESC
FETCH FIRST 20 ROWS ONLY;
-- 共有プール(Shared Pool)の空き領域を確認
SELECT
name,
ROUND(bytes / 1024 / 1024, 2) AS mb
FROM V$SGASTAT
WHERE pool = 'shared pool'
AND name IN ('free memory', 'library cache', 'dictionary cache')
ORDER BY bytes DESC;
V$SGA_DYNAMIC_COMPONENTS で動的コンポーネントを確認する
-- 動的に管理される SGA コンポーネントの現在サイズと上限・下限を確認
SELECT
component,
ROUND(current_size / 1024 / 1024, 0) AS current_mb,
ROUND(min_size / 1024 / 1024, 0) AS min_mb,
ROUND(max_size / 1024 / 1024, 0) AS max_mb,
user_specified_size / 1024 / 1024 AS user_spec_mb,
last_oper_type, -- GROW / SHRINK / STATIC
last_oper_time
FROM V$SGA_DYNAMIC_COMPONENTS
ORDER BY current_size DESC;
PGA の使用状況を確認・監視する
V$PGASTAT でインスタンス全体の PGA 統計を確認する
-- PGA 全体の使用状況を確認
SELECT
name,
ROUND(value / 1024 / 1024, 2) AS mb
FROM V$PGASTAT
WHERE name IN (
'aggregate PGA target parameter', -- PGA_AGGREGATE_TARGET の設定値
'aggregate PGA auto target', -- 自動管理対象の PGA 量
'total PGA inuse', -- 現在使用中の PGA 合計
'total PGA allocated', -- 割り当て済みの PGA 合計
'maximum PGA allocated' -- ピーク時の PGA 使用量
)
ORDER BY mb DESC;
V$PROCESS でプロセスごとの PGA 使用量を確認する
-- PGA 使用量が多いプロセス Top 10
SELECT
p.pid,
p.spid,
s.username,
s.program,
ROUND(p.pga_used_mem / 1024 / 1024, 2) AS pga_used_mb,
ROUND(p.pga_alloc_mem / 1024 / 1024, 2) AS pga_alloc_mb,
ROUND(p.pga_max_mem / 1024 / 1024, 2) AS pga_max_mb
FROM V$PROCESS p
LEFT JOIN V$SESSION s ON p.addr = s.paddr
WHERE p.pga_used_mem > 0
ORDER BY p.pga_used_mem DESC
FETCH FIRST 10 ROWS ONLY;
PGA_AGGREGATE_LIMIT(Oracle 12c以降)
PGA_AGGREGATE_LIMIT は全プロセスの PGA 合計のハード上限です(デフォルト: SGA の2倍または2GB の大きい方)。この上限を超えるとプロセスが強制終了します。PGA_AGGREGATE_TARGET はソフト目標値なので超過しても即時強制終了にはなりません。
バッファキャッシュヒット率の確認
バッファキャッシュとライブラリキャッシュのヒット率を確認する
-- バッファキャッシュヒット率(物理読み込みの発生率)
SELECT
ROUND(1 - (phyrds.value / (dbget.value + cget.value)), 4) * 100
AS buffer_cache_hit_pct
FROM
(SELECT value FROM V$SYSSTAT WHERE name = 'physical reads') phyrds,
(SELECT value FROM V$SYSSTAT WHERE name = 'db block gets') dbget,
(SELECT value FROM V$SYSSTAT WHERE name = 'consistent gets') cget;
-- 目標: 95% 以上(低い場合は DB_CACHE_SIZE を増やす)
-- ライブラリキャッシュヒット率(ハードパース発生率)
SELECT
ROUND(SUM(pinhits) / NULLIF(SUM(pins), 0) * 100, 2) AS library_cache_hit_pct
FROM V$LIBRARYCACHE;
-- 目標: 95% 以上(低い場合はバインド変数使用が重要)
まとめ
- AMM(MEMORY_TARGET):SGA+PGA の合計上限を指定して完全自動管理。Linux の HugePages とは併用不可
- ASMM(SGA_TARGET + PGA_AGGREGATE_TARGET):本番環境の推奨設定。HugePages を使いながら SGA を自動調整できる
- V$SGASTAT:SGA コンポーネントの使用量を確認する。共有プールの free memory が少ない場合は SHARED_POOL_SIZE を増設
- V$SGA_DYNAMIC_COMPONENTS:SGA 各コンポーネントの現在サイズと増減履歴(GROW/SHRINK)を確認する
- V$PGASTAT:PGA 全体の使用量・ピーク値を確認する
- V$PROCESS:プロセスごとの PGA 使用量を確認して大量使用プロセスを特定する
共有プール枯渇エラーの詳細な対処は ORA-04031完全ガイドを参照してください。メモリ設定後のパフォーマンス分析は AWR・ASH完全ガイドを活用してください。

