1.

Oracle SGA (System Global Area) の構成と管理(AMM / ASMM 完全解説)

編集
この記事の要点
  • SGA (System Global Area): Oracle インスタンスが使う共有メモリ。全プロセスで共有
  • 主要構成: Database Buffer Cache + Shared Pool + Redo Log Buffer + Large Pool + Java Pool + Streams Pool
  • 確認: SHOW SGA / v$sga(コンポーネント別サマリ)/ v$sgastat(細粒度)
  • 管理モード: AMM (MEMORY_TARGET) → ASMM (SGA_TARGET) → 手動 (各コンポーネント個別)
  • 主要パラメータ: SGA_TARGET / SGA_MAX_SIZE / MEMORY_TARGET / DB_CACHE_SIZE / SHARED_POOL_SIZE

SGA とは

SGA (System Global Area) は Oracle Database インスタンス起動時に確保される共有メモリ領域です。インスタンスを構成するすべてのバックグラウンドプロセスとサーバープロセスがアクセスし、データキャッシュや SQL の実行計画キャッシュなど、性能の要となるあらゆる情報がここに乗ります。

対して、各セッション固有のソート領域・カーソル情報などは PGA (Program Global Area) に置かれます。インスタンス全体で使用するメモリは SGA + PGA です。

SGA の構成要素

+----------------- SGA ------------------+
| Database Buffer Cache (データブロック)  |
| Shared Pool                             |
|   - Library Cache (SQL 実行計画/PL/SQL) |
|   - Data Dictionary Cache               |
|   - Result Cache                        |
| Redo Log Buffer                         |
| Large Pool (バックアップ/RMAN/共有サーバ)|
| Java Pool                               |
| Streams Pool                            |
| Fixed SGA (内部管理用)                  |
+----------------------------------------+
コンポーネント役割パラメータ
Database Buffer CacheデータブロックのキャッシュDB_CACHE_SIZE
Shared PoolSQL/PL-SQL 実行計画、データディクショナリSHARED_POOL_SIZE
Redo Log Buffer変更ログを REDO ファイルに書き出す前のバッファLOG_BUFFER
Large PoolRMAN バックアップ、共有サーバー、Parallel QueryLARGE_POOL_SIZE
Java PoolJava VM 用メモリJAVA_POOL_SIZE
Streams PoolStreams / GoldenGate 用キューSTREAMS_POOL_SIZE

SGA を確認するコマンド

-- SQL*Plus で簡易確認
SHOW SGA

-- 出力例:
-- Total System Global Area  8589934592 bytes
-- Fixed Size                   2261112 bytes
-- Variable Size             1543504200 bytes
-- Database Buffers          7038007296 bytes
-- Redo Buffers                6161984 bytes

-- v$sga: コンポーネント別サマリ
SELECT name, value/1024/1024 AS mb FROM v$sga;

-- v$sgainfo: 詳細
SELECT name, ROUND(bytes/1024/1024, 1) AS mb, resizeable
FROM v$sgainfo
ORDER BY bytes DESC;

-- v$sgastat: 最も細かい内訳
SELECT pool, name, ROUND(bytes/1024/1024, 2) AS mb
FROM v$sgastat
WHERE bytes > 1024*1024
ORDER BY bytes DESC;

パラメータ確認

-- 主要パラメータ
SHOW PARAMETER sga_target;
SHOW PARAMETER sga_max_size;
SHOW PARAMETER memory_target;
SHOW PARAMETER memory_max_target;

-- コンポーネント別
SHOW PARAMETER db_cache_size;
SHOW PARAMETER shared_pool_size;
SHOW PARAMETER large_pool_size;
SHOW PARAMETER java_pool_size;
SHOW PARAMETER log_buffer;

3 つのメモリ管理モード

モード設定パラメータ挙動
AMM (Automatic Memory Management)MEMORY_TARGETSGA + PGA を一括自動配分
ASMM (Automatic Shared Memory Management)SGA_TARGETSGA 内のコンポーネントを自動配分
手動各 SIZE パラメータを個別設定古いやり方。Oracle 9i 以前

AMM の設定(Oracle 11g+ 推奨)

-- MEMORY_TARGET だけ設定すれば SGA も PGA も自動
ALTER SYSTEM SET memory_target     = 16G SCOPE=SPFILE;
ALTER SYSTEM SET memory_max_target = 16G SCOPE=SPFILE;

-- SGA / PGA の個別パラメータは 0 にしておく
ALTER SYSTEM SET sga_target = 0 SCOPE=SPFILE;
ALTER SYSTEM SET pga_aggregate_target = 0 SCOPE=SPFILE;

-- 再起動が必要
SHUTDOWN IMMEDIATE
STARTUP

-- 注意: Linux で HugePages を使うなら AMM は不可 → ASMM を使う

ASMM の設定(HugePages 利用時 / 安定運用向け)

-- SGA だけ自動管理(PGA は別途 PGA_AGGREGATE_TARGET で指定)
ALTER SYSTEM SET sga_target   = 8G SCOPE=BOTH;
ALTER SYSTEM SET sga_max_size = 8G SCOPE=SPFILE;   -- 要再起動
ALTER SYSTEM SET pga_aggregate_target = 4G SCOPE=BOTH;

-- 個別コンポーネントは「最小保証値」として残せる
ALTER SYSTEM SET db_cache_size    = 2G SCOPE=BOTH;
ALTER SYSTEM SET shared_pool_size = 1G SCOPE=BOTH;
-- → Oracle がこれを下回らない範囲で動的に調整

SGA_TARGET と SGA_MAX_SIZE の関係

  • SGA_MAX_SIZE: SGA に確保しうる最大値(インスタンス起動時に予約される上限)。変更には再起動必須
  • SGA_TARGET: 動的に変更可能な「現在のターゲット値」。SGA_MAX_SIZE 以下なら自由に増減

運用パターン: SGA_MAX_SIZE を物理メモリの 60〜70% で確保 → SGA_TARGET を当初は小さめに → 監視しながら拡大。

HugePages を使った安定運用(Linux)

# 必要な HugePages 数を計算(例: SGA 8GB / HugePage 2MB)
# 8 * 1024 / 2 = 4096 ページ + 余裕で 4200 程度

# /etc/sysctl.conf に追加
vm.nr_hugepages = 4200

sudo sysctl -p

# /etc/security/limits.conf に追加(oracle ユーザー)
oracle soft memlock 8388608
oracle hard memlock 8388608

# 確認
grep HugePages /proc/meminfo
# HugePages_Total: 4200
# HugePages_Free:    50
# HugePages_Rsvd:    50

# Oracle 側
ALTER SYSTEM SET use_large_pages = ONLY SCOPE=SPFILE;
-- AMM (MEMORY_TARGET) と HugePages は併用不可!
ALTER SYSTEM SET memory_target = 0 SCOPE=SPFILE;
SHUTDOWN IMMEDIATE
STARTUP

SGA サイズの目安

物理メモリSGA 推奨PGA 推奨
8 GB4 GB2 GB
16 GB8 GB4 GB
32 GB16 GB8 GB
64 GB32 GB16 GB
128 GB64〜80 GB20〜30 GB

OS と他プロセス用に最低でも全体の 20% は残すこと。仮想化環境ではバルーニングに注意。

SGA リサイズイベントの監視

-- ASMM/AMM がコンポーネントを動的に変更した履歴
SELECT
    component,
    oper_type,
    oper_mode,
    initial_size/1024/1024  AS initial_mb,
    target_size/1024/1024   AS target_mb,
    final_size/1024/1024    AS final_mb,
    start_time, end_time, status
FROM v$sga_resize_ops
ORDER BY start_time DESC
FETCH FIRST 20 ROWS ONLY;

-- 現在のコンポーネントサイズ
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;

SGA 関連のエラー

エラー原因対処
ORA-00845: MEMORY_TARGET not supported on this system/dev/shm のサイズ不足tmpfs の mount オプションで size 拡大
ORA-04031: unable to allocate N bytes of shared memoryShared Pool 不足SHARED_POOL_SIZE 拡大 / バインド変数化
ORA-27101: shared memory realm does not existインスタンスが起動していないSTARTUP
ORA-04030: out of process memoryPGA 不足PGA_AGGREGATE_TARGET 拡大

FAQ

Q: AMM と ASMM どちらを選ぶ?
A: Linux で HugePages を使うなら ASMM 一択。Windows や HugePages 不要なら AMM が手軽。

Q: SGA を増やしたら遅くなった
A: スワップ発生していないか確認 (vmstat 1)。物理メモリを超過すると逆効果。

Q: 個別パラメータ (DB_CACHE_SIZE 等) は ASMM でも設定意味ある?
A: ASMM 下では「最小保証値」になります。動的調整でその値を下回らないようにできます。

編集
Post Share
子ページ
  1. データベースバッファキャッシュ
  2. 共有プール
  3. REDOログバッファ
  4. ラージプール
同階層のページ
  1. SGA(システムグローバル領域)
  2. PGA
  3. バックグラウンドプロセス