2.

Oracle PGAとは|SGAとの違い・PGA_AGGREGATE_TARGET

編集
この記事の要点
  • PGA (Program Global Area) はサーバープロセス専用のメモリ領域。各セッションがプライベートに使う
  • 主な内容: ソート領域 / ハッシュ結合領域 / カーソル状態 / セッション変数 (SQL の作業領域)
  • SGA は全プロセスで共有、PGA はプロセスごとに独立 — これが最重要の対比
  • サイズ管理は PGA_AGGREGATE_TARGET (合計目安) や PGA_AGGREGATE_LIMIT (ハードリミット) で行うのがモダン
  • 不足するとディスクソートが発生し性能劣化。V$PGASTAT / V$PROCESS で監視

PGA (プログラムグローバル領域) とは

PGA (Program Global Area) は Oracle Database で各サーバープロセスが個別に保持する非共有メモリ領域です。クライアントからの接続ごとに割り当てられるサーバープロセスが、SQL の実行に必要な作業領域として使用します。

全プロセスで共有される SGA (System Global Area) と対比される概念で、ソートやハッシュ結合のようにセッション固有の中間データを保持する役割を担います。

SGA との違い

項目SGAPGA
共有性全プロセスで共有プロセスごとに独立
主な用途バッファキャッシュ / 共有プール / REDO ログバッファソート領域 / ハッシュ結合領域 / カーソル状態
サイズ管理SGA_TARGET / SGA_MAX_SIZEPGA_AGGREGATE_TARGET / PGA_AGGREGATE_LIMIT
確保のタイミングインスタンス起動時に確保セッション接続時 / SQL 実行時

PGA の構成要素

領域役割
SQL 作業領域 (Work Area)ORDER BY のソート / ハッシュ結合 / GROUP BY のバッファ
セッションメモリセッション変数 / NLS 設定 / ログイン情報
プライベート SQL 領域カーソル状態 / バインド変数 / 実行プラン情報
スタック領域ローカル変数 / コールスタック

このうちもっともサイズ変動が大きいのが SQL 作業領域です。巨大なソートやハッシュ結合が走ると一時的に膨らみ、終わると解放されます。

サイズの管理 (推奨設定)

11g 以降は自動 PGA 管理が標準で、合計目安値を 1 つ設定するだけで Oracle が各セッションに動的に割り振ってくれます。

-- PGA の合計目安値 (Oracle が自動で配分)
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 2G SCOPE=BOTH;

-- ハードリミット (12c 以降推奨)
ALTER SYSTEM SET PGA_AGGREGATE_LIMIT = 4G SCOPE=BOTH;

-- 確認
SHOW PARAMETER PGA;
パラメータ意味
PGA_AGGREGATE_TARGETPGA 合計の目安値。超えても直ちにエラーにはならない
PGA_AGGREGATE_LIMITハードリミット。超えるとセッションがキル対象になる (12c 以降)
WORKAREA_SIZE_POLICYAUTO で自動管理、MANUAL で個別パラメータ指定

監視に使うビュー

-- 全体の PGA 使用状況
SELECT name, value/1024/1024 AS mb
FROM   v$pgastat
WHERE  name IN ('total PGA inuse',
                'total PGA allocated',
                'maximum PGA allocated',
                'over allocation count');

-- セッション別の PGA 使用量 TOP10
SELECT s.sid, s.username, p.pga_used_mem/1024/1024 AS used_mb
FROM   v$session s
JOIN   v$process p ON p.addr = s.paddr
ORDER  BY p.pga_used_mem DESC
FETCH  FIRST 10 ROWS ONLY;
ビュー内容
V$PGASTATPGA 全体の統計 (使用量・最大・オーバーアロケーション回数)
V$PROCESSプロセスごとの PGA 使用量 (PGA_USED_MEM 等)
V$SQL_WORKAREASQL 単位の作業領域使用情報
V$SQL_WORKAREA_ACTIVE現在アクティブな作業領域

不足したときの症状

  • 大量データのソート / GROUP BY が一時表領域 (TEMP) にスピルし、ディスク I/O が増える
  • ハッシュ結合がマルチパス化して結合時間が劇的に増加する
  • PGA_AGGREGATE_LIMIT 超過時はセッションが ORA-04036 でキルされる
  • 監視ビュー V$PGASTATover allocation count が増えていく

SGA / PGA の全体像

Oracle Instance
├── SGA (共有メモリ)
│    ├── Buffer Cache
│    ├── Shared Pool (Library / Dictionary Cache)
│    ├── Redo Log Buffer
│    └── Large Pool / Java Pool / Streams Pool
└── PGA (プロセスごと)
     ├── SQL Work Area (Sort / Hash / GroupBy)
     ├── Session Memory
     ├── Private SQL Area
     └── Stack

FAQ

Q: PGA を大きくすれば速くなる?
A: ソート / ハッシュ結合が多いワークロードでは劇的に速くなります。OLTP 中心なら効果は限定的。V$PGASTAT の cache hit % で判断してください。

Q: 自動メモリ管理 (AMM / ASMM) との関係は?
A: MEMORY_TARGET を使う AMM では SGA と PGA をまとめて 1 つの値で管理できます。ただし Linux では Hugepages 等の制約で SGA_TARGET + PGA_AGGREGATE_TARGET を個別管理する ASMM が主流です。

Q: ORA-04036 が出た時の対応
A: PGA_AGGREGATE_LIMIT を超過したセッションが強制終了されたサイン。アプリ側の大量データ処理を見直すか、リミットを増やします。

Q: 適切な PGA サイズの目安は?
A: OLAP 用途なら物理メモリの 20〜40%、OLTP 用途なら10〜20% が一般的な出発点。実測の maximum PGA allocatedover allocation count を見て調整します。

Q: 共有サーバー構成 (MTS) との違い
A: 共有サーバー構成では、本来 PGA に置かれるUGA (ユーザーグローバル領域) の一部がLarge Pool (SGA 内) に移動します。専用サーバー構成と挙動が変わる点に注意。

Q: PGA はバッファキャッシュとは別?
A: 別物です。バッファキャッシュ (SGA) はディスクブロックのキャッシュで全プロセス共有、PGA は計算の作業領域でプロセス専用。役割が異なります。

まとめ

PGA は Oracle のメモリ管理でSGA と並ぶ柱のひとつです。SGA が「共有」を担うのに対し、PGA は「プロセスごと」のセッションメモリを担当します。OLAP 系の大規模ソート / 結合では PGA の大きさが性能を直接左右するため、V$PGASTAT による監視と PGA_AGGREGATE_TARGET の適切な設定がチューニングの肝となります。

関連

  • SGA — 共有メモリ領域 (Buffer Cache / Shared Pool)
  • 一時表領域 (TEMP) — PGA からあふれたソートの行き先
  • サーバープロセス — PGA を所有する Oracle のプロセス
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. SGA(システムグローバル領域)
  2. PGA
  3. バックグラウンドプロセス

最近更新/作成されたページ