Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

SGA(エスジーエー)とは | 意味や読み方など丁寧でわかりやすい用語解説

SGA(エスジーエー)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

読み方

日本語表記

システムグローバルエリア (システムグローバルエリア)

英語表記

Shared Global Area (シェアード グローバル エリア)

用語解説

SGAは、Shared Global Areaの略称であり、Oracleデータベースのインスタンスにおいて中心的な役割を果たす共有メモリ領域である。Oracleデータベースは、データを格納するデータベース本体と、そのデータにアクセスし管理するためのOracleインスタンスというプログラム群で構成される。このOracleインスタンスの一部として、SGAは起動時にオペレーティングシステムのメモリ上に確保され、すべてのバックグラウンドプロセスやユーザープロセスが共有して利用する。SGAの存在意義は、データベースのパフォーマンスを劇的に向上させ、複数のユーザーが同時にアクセスする環境下でのデータの一貫性と整合性を維持することにある。データベースの応答速度や処理能力は、SGAの適切なサイズ設定と管理に大きく依存するため、データベースの運用において非常に重要な要素となる。

SGAは、単一の大きなメモリ領域として機能するのではなく、それぞれ特定の役割を持つ複数のサブコンポーネント、すなわちメモリプールで構成されている。これらのプールが連携し合うことで、データベースは効率的かつ信頼性の高い動作を実現する。主要なサブコンポーネントには、共有プール、データベースバッファキャッシュ、REDOログバッファなどがある。

まず、**共有プール(Shared Pool)**は、SQL文やPL/SQLブロックの解析情報、データディクショナリキャッシュといった情報を格納するメモリ領域である。ユーザーがSQL文を実行する際、OracleデータベースはそのSQL文の構文をチェックし、最適な実行計画を生成する解析処理を行う。この解析処理はCPUリソースを消費するため、一度解析されたSQL文の情報は共有プール内のライブラリキャッシュに格納される。もし同じSQL文が再度実行された場合、Oracleはライブラリキャッシュから既存の解析情報を再利用できるため、重複する解析処理を回避し、CPUオーバーヘッドを削減する。これは、特に多数のユーザーが共通のアプリケーションを利用し、頻繁に同じSQL文が実行されるようなシステムにおいて、顕著なパフォーマンス向上をもたらす。また、共有プールにはデータディクショナリキャッシュも含まれる。データディクショナリキャッシュは、テーブル名、列名、インデックス情報など、データベースの構造に関するメタデータ(定義情報)を保持する。これらの情報は、SQL文の解析やオブジェクトへのアクセス時に頻繁に参照されるため、メモリ上にキャッシュすることで、ディスクからの読み込みを減らし、高速なアクセスを可能にする。共有プールのサイズが小さすぎると、キャッシュされた情報がすぐにメモリから追い出され(エイジング)、再利用率が低下するため、パフォーマンスが悪化する可能性がある。

次に、**データベースバッファキャッシュ(Database Buffer Cache)**は、ディスク上のデータファイルから読み込まれたデータブロックを一時的に保持するメモリ領域である。Oracleデータベースは、データを直接ディスクから読み書きするのではなく、常にこのバッファキャッシュを介して行う。ユーザーがテーブルのデータを検索したり更新したりする際、まずそのデータブロックがバッファキャッシュに存在するかどうかを確認する。もしデータがすでにバッファキャッシュ内にあれば、ディスクI/Oを発生させることなく、メモリから直接高速にデータを読み込むことができる。これにより、頻繁にアクセスされるデータはメモリ上に保持され続け、全体の処理速度が向上する。これを「キャッシュヒット」と呼ぶ。一方、データブロックがバッファキャッシュに存在しない場合は、ディスクからバッファキャッシュに読み込まれてからユーザーに提供される。バッファキャッシュは、LRU(Least Recently Used)アルゴリズムなどのメカニズムを利用して、メモリの空き容量が不足した際に、最も長い間アクセスされていないデータブロックをメモリから追い出し、新しいデータブロックのために領域を確保する。データが更新された場合、その変更はまずバッファキャッシュ内で行われる。まだディスクに書き込まれていない変更済みデータブロックは「ダーティブロック」と呼ばれ、バックグラウンドプロセスであるDBWR(Database Writer)によって定期的にディスクへ書き込まれる。

そして、**REDOログバッファ(Redo Log Buffer)**は、データベースに対するすべての変更情報、すなわちREDOエントリを一時的に格納するメモリ領域である。データベース内でデータが挿入、更新、削除されるたびに、その変更内容はREDOエントリとしてREDOログバッファに書き込まれる。この情報は、データベースのトランザクションにおける「永続性」を保証するために不可欠である。もしシステム障害が発生し、データベースが予期せず停止した場合でも、REDOログに記録された変更情報をもとにデータベースを障害発生直前の状態まで回復させることができ、データの損失を防ぐことが可能となる。REDOログバッファ内のREDOエントリは、LGWR(Log Writer)というバックグラウンドプロセスによって、REDOログファイルとしてディスクに書き込まれる。この書き込みは、トランザクションがコミットされた時、REDOログバッファが特定のしきい値に達した時、または一定の時間間隔ごとに自動的に行われる。REDOログバッファのサイズが不十分だと、LGWRが頻繁にディスク書き込みを実行する必要が生じ、I/O性能がボトルネックとなりデータベースのパフォーマンスに悪影響を与える可能性がある。

これらの主要なコンポーネントの他に、SGAには特定の用途に特化したメモリプールも存在する。

**ラージプール(Large Pool)**は、共有プールでは処理しきれないような大きなメモリ領域を確保するために用いられる。例えば、Oracle Recovery Manager(RMAN)を用いたバックアップやリカバリ操作、I/Oサーバプロセス、パラレルクエリのメッセージバッファなどに利用される。ラージプールは、共有プールにおけるメモリの断片化を抑制し、より安定したメモリ管理を可能にする。

**Javaプール(Java Pool)**は、Oracleデータベース内でJavaコードを実行するために必要なメモリ領域である。Oracle JVM(Java Virtual Machine)に関連するセッションごとのJavaコードやデータ構造を格納するために使用され、データベース内でJavaアプリケーションがデプロイされている場合にその性能に影響を与える。

**ストリームプール(Streams Pool)**は、Oracle Streams機能を利用する際に使用されるメモリ領域である。Oracle Streamsは、データベース間のデータ伝播や統合を目的とした機能であり、このプールはメッセージキュー、変更データキャプチャ、および適用プロセスなどの操作のために使用される。

SGAは、Oracleデータベースインスタンスの中核をなす共有メモリ領域であり、その構成と各コンポーネントの機能、そしてそれらの相互作用を理解することは、データベースの健全な運用とパフォーマンスチューニングを行う上で不可欠である。Oracleデータベースは、SGAのサイズを自動的に調整するAMM(Automatic Memory Management)やASMM(Automatic Shared Memory Management)といった自動管理機能を備えているが、これらの機能を理解し、必要に応じて手動で調整する知識も、システムエンジニアとしてデータベースを扱う上で重要となる。SGAの各コンポーネントがどのように連携し、データベースのトランザクション処理やクエリ実行に影響を与えるかを把握することで、効率的で信頼性の高いデータベースシステムを設計・運用できるようになる。

関連コンテンツ

関連IT用語