Oracle Databaseの安定運用・高パフォーマンス実現の鍵は、メモリの適切な管理にあります。
本記事では、Oracleのメモリ構成(SGA・PGA・UGA・コード領域)をわかりやすく解説し、メモリ管理方式(AMM、ASMM、手動)と監視方法、さらに具体的なSQL例やビューについても図解付きで詳しく説明します。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
1. Oracleの基本メモリ構造
Oracleインスタンスが起動すると、以下のようなメモリ領域が割り当てられます。
【Oracle Databaseのメモリ構成】
+------------------------------------------------------+
| Software Code Areas(実行コード領域) |
+------------------------------------------------------+
| ┌────────────┬──────────┬───────────┐ |
| │ SGA │ PGA │ UGA │ |
| │ (共有領域) │ (個別領域)│ (セッション情報)│ |
| └────────────┴──────────┴───────────┘ |
| |
| ・SGA:全プロセスで共有されるメモリ領域 |
| ・PGA:各プロセス(専用/バックグラウンド)の私有領域 |
| ・UGA:ユーザーセッションに紐づくデータを格納 |
+------------------------------------------------------+
- SGA(System Global Area)
データキャッシュやSQLパース結果、制御情報を格納する共有メモリ。全プロセスで共用。 - PGA(Program Global Area)
ソート領域やワークエリアなど、各サーバープロセス専用の私有メモリ領域。 - UGA(User Global Area)
ユーザーセッションごとの一時的なデータを格納。共有サーバー環境ではSGA内に置かれる。 - Software Code Area
Oracleソフトウェアの実行コードが読み込まれる読み取り専用領域。
SGAについては詳細はコチラ。
2. メモリ管理方式の概要
Oracleでは、以下のいずれかの方式でメモリを管理します。
2.1 自動メモリ管理(AMM:Automatic Memory Management)
MEMORY_TARGETを設定することで、SGAとPGAを統合的に自動管理します。- Oracleが動的に領域を調整し、全体の最適化を図ります。
ALTER SYSTEM SET MEMORY_TARGET = 2G SCOPE=SPFILE;
ALTER SYSTEM SET MEMORY_MAX_TARGET = 4G SCOPE=SPFILE;
2.2 自動共有メモリ管理(ASMM:Automatic Shared Memory Management)
SGA_TARGETおよびPGA_AGGREGATE_TARGETを個別に指定。- SGAのみ自動的に配分され、PGAは指定した目標値で管理されます。
ALTER SYSTEM SET SGA_TARGET = 1.5G SCOPE=BOTH;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 512M SCOPE=BOTH;
ALTER SYSTEM SET SGA_MAX_SIZE = 2G SCOPE=SPFILE;
2.3 手動管理(Manual Memory Management)
SHARED_POOL_SIZE,DB_CACHE_SIZE,LOG_BUFFERなど、各領域を手動で設定。- 柔軟性はあるものの、運用管理が煩雑になるため現在は非推奨。
3. メモリ管理方式の選択図解
【メモリ管理の方式選択フロー】
ユーザーによる構成方針
↓
┌────────────┐
│ メモリ管理方式 │
└────────────┘
↓ ↓ ↓
AMM ASMM + PGA Manual
(MEMORY_TARGET) (SGA_TARGET) (個別パラメータ)
↓ ↓ ↓
Oracleが動的に最適配分を実施(AMM/ASMM)
4. SGA・PGAの構成要素と役割
4.1 SGAの構成要素
| コンポーネント | 説明 |
|---|---|
| Shared Pool | SQL解析結果・PL/SQL・辞書情報を格納(Library Cache / Dictionary Cache) |
| Database Buffer Cache | データファイルの読み取りブロックをキャッシュする領域 |
| Redo Log Buffer | トランザクション変更をログファイルへ書き込む前に一時保存 |
| Java Pool | Javaコード(JVM/Java Stored Procedures)実行時のメモリ領域 |
| Large Pool | RMAN・並列実行・共有サーバー処理などで使用 |
| Streams Pool | Oracle Streams 用メモリ領域(現在は利用頻度低) |
4.2 PGAの主な用途
- ソート処理
- ハッシュジョイン
- ワークエリアの一時データ保持
4.3 UGAの概要
- セッション情報やカーソル情報を保持
- 専用サーバー:PGA内
- 共有サーバー:SGA内に格納される
5. 各管理方式におけるパラメータ設定例
| 管理方式 | 設定パラメータ |
|---|---|
| AMM | MEMORY_TARGET, MEMORY_MAX_TARGET |
| ASMM | SGA_TARGET, SGA_MAX_SIZE, PGA_AGGREGATE_TARGET |
| Manual | SHARED_POOL_SIZE, DB_CACHE_SIZE, LOG_BUFFER など |
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
6. メモリ使用状況の監視ビュー
以下の動的パフォーマンスビューを使用して、メモリ状況を監視できます。
| ビュー名 | 内容 |
|---|---|
V$SGAINFO | SGAの各構成要素のサイズ |
V$PGASTAT | PGA全体の統計情報(最大使用量など) |
V$SGASTAT | SGA構成要素ごとの詳細な割当状況 |
V$MEMORY_DYNAMIC_COMPONENTS | メモリコンポーネントの現在値・操作履歴など |
監視SQLの例:
SELECT COMPONENT, CURRENT_SIZE FROM V$MEMORY_DYNAMIC_COMPONENTS;
コマンド実行例
SQL> SELECT COMPONENT, CURRENT_SIZE FROM V$MEMORY_DYNAMIC_COMPONENTS;
COMPONENT CURRENT_SIZE
---------------------------------------- ------------
shared pool 234881024
large pool 16777216
java pool 16777216
streams pool 0
unified pga pool 0
SGA Target 922746880
memoptimize buffer cache 0
DEFAULT buffer cache 587202560
KEEP buffer cache 0
RECYCLE buffer cache 0
DEFAULT 2K buffer cache 0
DEFAULT 4K buffer cache 0
DEFAULT 8K buffer cache 0
DEFAULT 16K buffer cache 0
DEFAULT 32K buffer cache 0
Shared IO Pool 50331648
Data Transfer Cache 0
In-Memory Area 0
In Memory RW Extension Area 0
In Memory RO Extension Area 0
PGA Target 620756992
ASM Buffer Cache 0
22 rows selected.
7. V$MEMORY_DYNAMIC_COMPONENTS の列定義
このビューは、SGAにおける動的メモリサイズの変更状況を示します。すべてのサイズはバイト単位で表されます。
| 列名 | データ型 | 説明 |
|---|---|---|
| COMPONENT | VARCHAR2(64) | コンポーネント名 |
| CURRENT_SIZE | NUMBER | 現在のサイズ |
| MIN_SIZE | NUMBER | 最小サイズ(起動後) |
| MAX_SIZE | NUMBER | 最大サイズ(起動後) |
| USER_SPECIFIED_SIZE | NUMBER | ユーザー指定のサイズ |
| OPER_COUNT | NUMBER | 変更回数 |
| LAST_OPER_TYPE | VARCHAR2(13) | 最後の操作タイプ(GROW/SHRINKなど) |
| LAST_OPER_MODE | VARCHAR2(9) | 操作モード(IMMEDIATE等) |
| LAST_OPER_TIME | DATE | 最後の操作時刻 |
| GRANULE_SIZE | NUMBER | 増減時の単位(グラニュールサイズ) |
8. メモリ管理のメリットとリスク
✅ 適切な設定のメリット
- SQL解析の高速化(Shared Pool)
- ディスクI/O削減(Buffer Cache)
- 安定したトランザクション処理(Redo Log Buffer)
- 並列処理やバックアップの安定性向上(Large Pool)
⚠️ 不適切な設定のリスク
- SQL再解析が多発 → CPU使用率増加
- ディスクI/O増大 → レスポンス悪化
- REDO書き込み遅延 → コミット遅延・ロック競合
- PGA不足 → ソート失敗・TEMP過剰使用
9. メモリ領域ごとの管理方式まとめ図
【管理方式別:メモリ領域の配分イメージ】
+----------------------------------+
| MEMORY_TARGET=4G |
+----------------------------------+
| [ AMM(自動) ] |
| +--------------+-------------+ |
| | SGA | PGA | |
| +--------------+-------------+ |
+----------------------------------+
+-------------------------------+
| [ ASMM + PGA_AGGREGATE ] |
| SGA自動 / PGA手動 |
+-------------------------------+
+-------------------------------+
| [ Manual Management ] |
| 各パラメータを手動設定 |
+-------------------------------+
まとめ
Oracleのメモリ管理は、性能と安定性を左右する最重要要素の一つです。
AMMやASMMを活用することで、動的かつ効率的なリソース配分が可能となり、管理者の負担を軽減できます。
一方で、メモリ不足や偏りは深刻なパフォーマンス劣化を引き起こすため、ビューによる定期的な監視と適切な設計・検証が不可欠です。
[参考]
5.4.1 メモリー管理について
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?




コメント