Oracle Databaseのメモリ管理において中核を担う「SGA(System Global Area)」は、パフォーマンスや安定性に直結する重要なコンポーネントです。
本記事では、SGAの役割や構成要素を図解付きで分かりやすく解説します。初心者の方でも理解しやすいように、基本概念から構成ユニットまで丁寧に説明していきます。
Oracleのメモリ全体の解説についてはコチラ。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
1. SGAとは?
SGA(System Global Area)とは、Oracleインスタンス起動時に割り当てられる共有メモリ領域のことです。
このSGAは、全てのサーバープロセスやバックグラウンドプロセスが共通して使用します。
主に以下の目的で使用されます:
- SQL文の解析結果や実行計画をキャッシュ(共有プール)
- 表や索引のブロックをキャッシュ(バッファキャッシュ)
- ログ書き込み前の変更情報を保持(ログバッファ)
つまり、SGAはOracleデータベースの性能に大きな影響を与える、非常に重要なメモリ領域です。
2. テキスト図:OracleインスタンスとSGAの関係
【Oracleインスタンスの構成イメージ】
+----------------------------+
| Oracle Instance |
| +----------------------+ |
| | SGA | | ← 共有メモリ(全プロセスで共有)
| +----------------------+ |
| | Background Process | | ← 例:DBWn、LGWR、CKPT など
| +----------------------+ |
+----------------------------+
3. SGAを構成する主要コンポーネント
SGAは複数のメモリ領域で構成されており、それぞれ異なる役割を持ちます。
| コンポーネント名 | 概要 |
|---|---|
| 共有プール(Shared Pool) | SQL文やPL/SQLコードの解析結果、ディクショナリ情報をキャッシュ |
| データベース・バッファ・キャッシュ(Buffer Cache) | データファイルのブロックをメモリに保持し、高速にアクセス可能にする |
| REDOログ・バッファ(Redo Log Buffer) | トランザクションの変更情報を一時的に保持 |
| Javaプール(Java Pool) | Javaベースの処理用に使用される |
| Large Pool(ラージ・プール) | バックアップやI/Oバッファなど、大規模メモリ処理用 |
| Streams Pool | Oracle Streamsで使用される |
4. 各コンポーネントの詳細
4.1 共有プール(Shared Pool)
+------------------------------+
| Shared Pool |
| +------------------------+ |
| | Library Cache | ← SQLの解析結果など
| +------------------------+ |
| | Data Dictionary Cache | ← システム辞書情報
| +------------------------+ |
+------------------------------+
- ライブラリキャッシュ:SQLやPL/SQLの解析結果、実行計画を保持。SQLの再解析を減らし、CPU負荷を軽減。
- ディクショナリキャッシュ:表定義や権限、列情報などのデータ・ディクショナリ情報を保持。
4.2 データベース・バッファ・キャッシュ(Database Buffer Cache)
+----------------------------+
| Database Buffer Cache |
| +--------+ +--------+ |
| | Block1 | | Block2 |...|
| +--------+ +--------+ |
+----------------------------+
- データファイル内のブロックをメモリ上に保持。
- ユーザーがアクセスするデータは一度このキャッシュに読み込まれる。
- キャッシュにヒットすればディスクアクセスは不要になり高速化。
4.3 REDOログ・バッファ(Redo Log Buffer)
- トランザクションによる変更内容を一時的に保持する領域。
- LGWRプロセスがREDOログファイルへ書き出すまでの待機場所。
- REDOログバッファが小さいとトランザクションの待ちが発生することも。
4.4 Java Pool / Large Pool / Streams Pool
- Java Pool:Javaコード(JVM、Java Stored Procedureなど)の実行用。
- Large Pool:RMANバックアップ、共有サーバー、並列実行などで使用。
- Streams Pool:Oracle Streams関連の情報保持用(現在は使用頻度低い)。
5. SGAサイズの設定と自動メモリ管理(ASMM)
OracleではSGAサイズを手動で調整することも、自動的に管理させることもできます。
5.1 自動SGA管理(ASMM:Automatic Shared Memory Management)
SGA_TARGETを指定するとOracleが構成要素へメモリを自動分配。- 上限値は
SGA_MAX_SIZEによって制限。
ALTER SYSTEM SET SGA_TARGET = 1G SCOPE=BOTH;
ALTER SYSTEM SET SGA_MAX_SIZE = 2G SCOPE=SPFILE;
5.2 手動での設定(非推奨)
- ASMMを使わない場合は、以下のパラメータを個別に設定:
| パラメータ名 | 説明 |
|---|---|
| SHARED_POOL_SIZE | 共有プールのサイズ |
| DB_CACHE_SIZE | バッファキャッシュのサイズ |
| LOG_BUFFER | REDOログバッファのサイズ |
| LARGE_POOL_SIZE | ラージプールのサイズ |
6. テキスト図:SGAの構成まとめ
【SGAの構成図】
+---------------------------------------+
| SGA |
| +-------------------------------+ |
| | Shared Pool | |
| | +-- Library Cache | | |
| | +-- Data Dictionary Cache | | |
| +-------------------------------+ |
| +-- Database Buffer Cache | |
| +-- Redo Log Buffer | |
| +-- Java Pool | |
| +-- Large Pool | |
| +-- Streams Pool | |
+---------------------------------------+
7. 注意点とベストプラクティス
- 適切なSGAサイズを確保しないとパフォーマンスが著しく低下します。
- 共有プールが不足 → SQLの再解析が頻発 → CPU負荷増加。
- バッファキャッシュが不足 → ディスクI/Oが増加 → 処理遅延。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
8. 自動メモリー管理(AMM:Automatic Memory Management)
OracleではSGAだけでなくPGAも含めて一元的に管理するAMM(完全自動メモリー管理)も利用可能です。
有効化に必要なパラメータ
ALTER SYSTEM SET MEMORY_TARGET = 2G SCOPE=SPFILE;
ALTER SYSTEM SET MEMORY_MAX_TARGET = 3G SCOPE=SPFILE;
AMMとASMMの違い
| 管理方式 | 管理対象 | パラメータ |
|---|---|---|
| ASMM | SGAのみ | SGA_TARGET, PGA_AGGREGATE_TARGET |
| AMM | SGA + PGA | MEMORY_TARGET, MEMORY_MAX_TARGET |
※AMM使用時は
SGA_TARGETとPGA_AGGREGATE_TARGETは不要です。
9. SGAの監視方法
SGAの状態は動的パフォーマンスビューから確認できます。
9.1 SGA全体の使用状況確認
SELECT * FROM V$SGA;
コマンド実行例
SQL> SELECT * FROM V$SGA;
NAME VALUE CON_ID
-------------------- ---------- ----------
Fixed Size 8896880 0
Variable Size 889192448 0
Database Buffers 637534208 0
Redo Buffers 7876608 0
9.2 SGA構成要素ごとのメモリ使用状況
SELECT POOL, NAME, BYTES
FROM V$SGASTAT
ORDER BY BYTES DESC;
コマンド実行例
SQL> SELECT POOL, NAME, BYTES
2 FROM V$SGASTAT
3 ORDER BY BYTES DESC;
POOL NAME BYTES
-------------- -------------------------- ----------
buffer_cache 587202560
shared_io_pool 50331648
shared pool free memory 20132792
java pool free memory 16777216
large pool free memory 16285696
shared pool ksunfy_meta 1 12589184
shared pool SQLA 10486928
shared pool SO private sga 9555320
shared pool row cache mutex 9019032
fixed_sga 8896880
shared pool KGLH0 8886624
log_buffer 7876608
shared pool private strands 6945792
shared pool row cache hash 6012688
shared pool KGLSG 5260816
shared pool obj stats allocation chun 5160960
:
shared pool LGWR post requested array 8
shared pool DNFS Disp context arr 8
shared pool kcrfwy: shutdowns 8
shared pool KEWS PDB SGA 8
shared pool ksunfy: in-use PSO Numa A 8
shared pool kffssga 8
shared pool ptr to sessions under idl 8
shared pool kghpinfo ptrs 8
shared pool ksmscrsas:1 8
shared pool ksuloi: garbage collectio 8
shared pool KCFIS SGA 8
shared pool kglPdbDebugStat 8
1413 rows selected.
9.3 バッファキャッシュのヒット率確認
SELECT NAME, VALUE
FROM V$SYSSTAT
WHERE NAME IN (
'physical reads',
'db block gets',
'consistent gets'
);
コマンド実行例
SQL> SELECT NAME, VALUE
2 FROM V$SYSSTAT
3 WHERE NAME IN (
4 'physical reads',
5 'db block gets',
6 'consistent gets'
7 );
NAME VALUE
---------------------------------------------------------------- ----------
db block gets 4535
consistent gets 110722
physical reads 7970
ヒット率の計算式:
(1 - (physical reads / (db block gets + consistent gets))) * 100
10. SGAを適切に設定するメリット
- ✅ SQL実行の高速化
SQL解析結果をキャッシュし再利用できるため、CPU使用量削減。 - ✅ ディスクI/Oの抑制
データアクセスの大半をメモリ上で処理可能にし、物理I/Oを減少。 - ✅ トランザクション処理のスムーズ化
ログバッファが十分であれば、REDO書き込み待ちが減少。 - ✅ RMANや並列処理の安定稼働
Large Poolを適切に設定することで、高負荷作業時の失敗リスクを回避。
11. SGAが適切に設定されていない場合に発生する可能性のある問題
- ❌ SQLの再解析が頻発(共有プール不足)
同じSQLでも毎回パースが必要になり、CPUと時間を浪費。 - ❌ ディスクアクセスが増加(バッファキャッシュ不足)
ブロックがキャッシュに載らないため、物理I/Oが多発。 - ❌ トランザクションの待機(REDOログバッファ不足)
ログ書き込み待ちが発生し、処理遅延・競合の原因に。 - ❌ RMANや並列処理の停止(Large Pool未設定)
エラーや処理失敗につながりやすくなる。
まとめ
SGAはOracleインスタンスにおける最も重要なメモリ領域であり、各プロセスが共有して使用します。
適切な構成によって、SQL解析・データアクセス・トランザクション・バックアップ処理のパフォーマンスを大きく改善できます。
ASMMやAMMといった自動メモリー管理機能を活用し、日々の監視とチューニングを行うことが、安定稼働への鍵となります。
逆に設定が不適切な場合、深刻な性能低下や処理エラーの温床となるため注意が必要です。
[参考]
5.1.4.1 システム・グローバル領域
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?




コメント