ヘッダーをスキップ

Oracle Database 概要
10gリリース2(10.2)

B19215-02
目次
目次
索引
索引

戻る 次へ

8 メモリー・アーキテクチャ

この章では、Oracleインスタンスのメモリー・アーキテクチャについて説明します。

この章の内容は、次のとおりです。

Oracleメモリー構造の概要

Oracleは、メモリーを使用して次のような情報を格納します。

Oracleに関連する基本的なメモリー構造は、次のような領域で構成されます。

図8-1にこれらメモリー構造の関係を示します。

図 8-1    Oracleのメモリー構造


画像の説明

ソフトウェア・コード領域は、もう1つの基本的なメモリー構造です。

関連項目

 

システム・グローバル領域の概要

システム・グローバル領域(SGA)とは、共有メモリー構造のグループで、1つのOracleデータベース・インスタンスのためのデータと制御情報が含まれています。 複数のユーザーが同じインスタンスに同時に接続した場合、そのインスタンスのSGA内のデータはユーザー間で共有されます。このため、SGAは共有グローバル領域と呼ばれることもあります。

SGAとOracleプロセスによって、1つのOracleインスタンスが構成されます。インスタンスを起動すると、Oracleが自動的にSGA用のメモリーを割り当て、インスタンスを停止すると、オペレーティング・システムがそのメモリーの割当てを解除します。各インスタンスには、それぞれ専用のSGAがあります。

SGAは読取り/書込み可能です。マルチ・プロセス・データベースのインスタンスに接続しているすべてのユーザーは、そのインスタンスのSGAに含まれている情報を読み込むことができます。また、Oracleの稼働中に、複数のプロセスがSGAに書き込むことができます。

SGAには、次のようなデータ構造が含まれています。

SGAの一部には、バックグラウンド・プロセスがアクセスする必要のある、データベースとインスタンスの状態に関する一般的な情報が含まれています。この部分を固定SGAと呼びます。ここには、ユーザー・データは格納されません。SGAには、ロック情報などのプロセス間でやり取りされる情報も格納されます。

システムが共有サーバー・アーキテクチャを使用している場合、要求キューとレスポンス・キュー、およびPGA領域の内容の一部はSGAに格納されます。

関連項目

 

SGA_MAX_SIZE初期化パラメータ

SGAは、いくつかのメモリー・コンポーネントで構成されています。このコンポーネントは、特定のクラスのメモリー割当て要求を満たすために使用するメモリーのプールです。メモリー・コンポーネントの例には、共有プール(SQLとPL/SQLを実行するためのメモリー割当てに使用)、Javaプール(Javaオブジェクトと他のJava実行メモリーで使用)、バッファ・キャッシュ(ディスク・ブロックのキャッシュに使用)などがあります。すべてのSGAコンポーネントは、グラニュルの単位で領域の割当ておよび割当ての解除を実行します。Oracle Databaseでは、SGAメモリーの使用が各SGAコンポーネントに対する内部的なグラニュル数で追跡されます。

グラニュル・サイズは、SGA全体のサイズによって決定されます。ほとんどのプラットフォームにおいて、SGA全体のサイズが1GBより小さい場合にグラニュル・サイズは4MB、1GB以上の場合は16MBです。プラットフォームへの依存性が存在する場合があります。たとえば、32ビットのWindowsでは、1GB以上のSGAのグラニュル・サイズは8MBです。

Oracle Databaseは、データベースがSGA用に使用する仮想メモリー・サイズの上限を設定できます。また、最小のメモリーでインスタンスを起動してそのインスタンスがより多くのメモリーを使用できるように、SGAコンポーネントに割り当てるメモリーをSGA_MAX_SIZE初期化パラメータで指定されている最大値まで増やすことができます。インスタンスの初期化時に、初期化パラメータ・ファイルまたはサーバー・パラメータ・ファイル(SPFILE)内の
SGA_MAX_SIZEの値が、すべてのコンポーネントに対してパラメータ・ファイルで明示的またはデフォルトで割り当てたメモリーの合計より少ない場合、データベースはそのSGA_MAX_SIZEの設定を無視します。

多くのシステムで最適なパフォーマンスを実現するには、SGA全体が実メモリーに収まることが必要です。収まらず、その一部を格納するために仮想メモリーが使用される場合は、データベース・システム全体のパフォーマンスが大幅に低下する可能性があります。これは、オペレーティング・システムがSGAの一部についてページング(ディスクの読取りおよび書込み)を実行するためです。SGA内のすべての共有領域に専用に割り当てられるメモリーの量も、パフォーマンスに影響します。

SGAのサイズは、いくつかの初期化パラメータによって決定されます。次のパラメータは、SGAサイズに最も大きく影響します。

パラメータ  説明 

DB_CACHE_SIZE 

標準ブロックのキャッシュ・サイズ。  

LOG_BUFFER 

REDOログ・バッファに割り当てられるバイト数。 

SHARED_POOL_SIZE 

共有SQL文と共有PL/SQL文に割り当てられる領域のサイズ
(単位はバイト)。 

LARGE_POOL_SIZE 

ラージ・プールのサイズ。デフォルトは0(ゼロ)。 

JAVA_POOL_SIZE 

Javaプールのサイズ。 

自動共有メモリー管理

以前のリリースのデータベースでは、データベース管理者(DBA)はSHARED_POOL_SIZEDB_CACHE_SIZEJAVA_POOL_SIZELARGE_POOL_SIZEパラメータなどいくつかの初期化パラメータを設定して、手動で異なるSGAコンポーネント・サイズを指定する必要がありました。Oracle Database 10gは、SGAメモリー管理を大幅に簡素化する自動共有メモリー管理機能を備えています。Oracle Database 10gでは、DBAはSGA_TARGET初期化パラメータを使用して、インスタンスで使用可能なSGAメモリーの合計容量のみ指定します。Oracle Databaseは、メモリー使用率が最も効率的になるように、そのメモリーを様々なサブコンポーネントに自動的に分配します。

自動SGAメモリー管理が使用可能な場合、様々なSGAコンポーネントのサイズは柔軟に変更され、ワークロードのニーズにあわせて調整されるため、追加構成は必要はありません。データベースは、必要に応じて使用可能なメモリーを様々なコンポーネントに自動的に分配するため、システムでは使用可能なSGAメモリーを最大限に使用できます。

SGAで使用できる1GBのメモリーを次の初期化パラメータに分配する手動の構成を考えてみます。

SHARED_POOL_SIZE=128M
DB_CACHE_SIZE=896M

アプリケーションが共有プールから128MBを超えるメモリーを割り当てようとすると、使用可能な共有プールが不足していることを示すエラーが発生します。バッファ・キャッシュに空きメモリーがあっても、そのメモリーは共有プールで使用できません。この問題の次善策は、バッファ・キャッシュと共有プールのサイズを変更することです。

自動SGA管理を使用した場合は、SGA_TARGET初期化パラメータを1GBに設定するのみです。アプリケーションでさらに共有プールのメモリーが必要な場合、そのメモリーはバッファ・キャッシュから取得されます。

1つのパラメータのみを設定するため、管理タスクは大幅に簡素化されます。つまり、DBAは、インスタンスが使用できるSGAメモリーの容量のみを指定し、各コンポーネントのサイズを意識する必要はありません。システムで実際にメモリーが不足しないかぎり、メモリー不足のエラーは生成されません。

自動SGA管理によってワークロードのパフォーマンスが向上するため、追加リソースや手動によるチューニングは必要ありません。手動によるSGAの構成では、共有プールのサイズが不適切なために、コンパイルされたSQL文が共有プールから頻繁にエージ・アウトする可能性があります。これによって、ハード解析の頻度が増し、パフォーマンスが低下します。自動SGA管理が使用可能な場合に、メモリーの増加により必要な解析の回数が削減されると判断されたとき、内部チューニング・アルゴリズムによってワークロードのパフォーマンスが監視され、共有プールのメモリーが増加します。

関連項目

  • 『Oracle Database 管理者ガイド』

  • 『Oracle Databaseパフォーマンス・チューニング・ガイド』

 

SGA_TARGET初期化パラメータ

SGA_TARGET初期化パラメータはSGAの合計サイズを反映し、次のコンポーネントのメモリーが含まれます。

以前のリリースでは、内部的な固定SGA用のメモリーは、構成済SGAメモリー・パラメータの合計に追加されていましたが、現行リリースではSGA_TARGETにSGA用のメモリー全体が格納できるようになりました。したがって、SGA_TARGETを使用することによって、データベースで割り当てられる共有メモリー領域のサイズを正確に制御できます。起動時に
SGA_TARGETSGA_MAX_SIZEより大きい値に設定すると、そのSGA_TARGETに対応してSGA_MAX_SIZEが増加します。


注意

SGA_TARGETパラメータは、動的に設定または設定解除しないでください。このパラメータは起動時にのみ設定する必要があります。 


自動管理のSGAコンポーネント

SGA_TARGETの値を設定すると、Oracle Database 10gは最も一般的に構成される次のコンポーネントのサイズを自動的に変更します。

これらのコンポーネントのサイズは明示的に設定する必要はありません。デフォルトでは、これらのコンポーネントのパラメータは0(ゼロ)に設定されています。メモリーが必要なコンポーネントは、内部的な自動チューニング・メカニズムの方法によって別のコンポーネントからメモリーを転送するように要求できます。このメモリーの転送は、ユーザーの介入なしに透過的に実行されます。

これらのコンポーネントのサイズは自動的に決定され、それぞれのパフォーマンスはOracle Databaseインスタンスで監視されます。インスタンスは、内部ビューと統計を使用して、コンポーネントにメモリーを適切に分配する方法を決定します。ワークロードの変化に応じて、最適なパフォーマンスとなるようにメモリーが再分配されます。メモリーの最適な分配を計算するために、データベースでは長期と短期の傾向を考慮するアルゴリズムが使用されます。

手動管理のSGAコンポーネント

サイズが自動的に調整されないSGAコンポーネントがいくつかあります。管理者は、アプリケーションでそのようなコンポーネントが必要な場合、サイズを明示的に指定する必要があります。次のコンポーネントがこれに該当します。

これらのコンポーネントのサイズは、対応するパラメータの値を管理者が定義して決定します。この値は、Enterprise ManagerまたはALTER SYSTEM文のコマンドラインを使用していつでも変更できます。

手動でサイズを指定するコンポーネントが消費するメモリー量は、自動調整用に使用可能なメモリー量から差し引かれます。たとえば、次の構成を考えます。

SGA_TARGET = 256M
DB_8K_CACHE_SIZE = 32M

このインスタンスでは、サイズが自動的に決定するコンポーネント間で分配されるメモリー量が224MB(256 - 32)のみになります。

自動チューニングされた値の永続性

サーバー・パラメータ・ファイル(SPFILE)を使用している場合、Oracle Databaseでは、インスタンスが停止しても自動チューニングされたコンポーネントのサイズが保持されます。このため、システムは、インスタンスが起動するたびにワークロードの特性を認識する必要があります。ワークロードの特性は、過去のインスタンスの情報に基づいて、前回インスタンスが停止した時点でのワークロードを継続して評価できます。

グラニュルの追加とコンポーネント・サイズの追跡

データベース管理者は、ALTER SYSTEM文を使用して各コンポーネントに対応する初期化パラメータの値を変更し、コンポーネントによるSGA使用量を増やします。Oracle Databaseは、新規に指定されたサイズを16MBに最も近似の倍数に切り上げ、ターゲット・サイズにあわせてグラニュル数を増減させます。データベースには、要求を十分に満たせる空きグラニュルが必要です。現在のSGAメモリー量がSGA_MAX_SIZEより小さいかぎり、データベースはSGAサイズがSGA_MAX_SIZEに達するまでグラニュルを割り当てることができます。

各コンポーネントのSGAに現在使用されているグラニュル・サイズは、V$SGAINFOビューで表示できます。各コンポーネントのサイズ、および各コンポーネントで前回実行されたサイズ変更操作の時期とタイプは、V$SGA_DYNAMIC_COMPONENTSビューで表示できます。データベースでは、SGAコンポーネントに対して実行された過去400回の操作の循環バッファがメンテナンスされます。循環バッファはV$SGA_RESIZE_OPSビューで表示できます。


注意

コンポーネント用にグラニュル・サイズの倍数でないサイズを指定すると、最も近似の倍数に切り上げられます。たとえば、グラニュル・サイズが4MBの場合にDB_CACHE_SIZEを10MBとして指定すると、実際には12MBが割り当てられます。 


関連項目

  • メモリー割当ての詳細は、『Oracle Database 管理者ガイド』を参照してください。

  • Enterprise Managerを使用してSGAサイズを表示する方法は、『Oracle Database 2日でデータベース管理者』を参照してください。

  • SQL*PlusでSGAのサイズを表示する方法は、『SQL*Plusユーザーズ・ガイドおよびリファレンス』を参照してください。

  • V$SGASTATの詳細は、『Oracle Databaseリファレンス』を参照してください。

  • オペレーティング・システム固有の情報は、該当するOracleインストレーション・ガイドまたはユーザーズ・ガイドを参照してください。

 

データベース・バッファ・キャッシュ

データベース・バッファ・キャッシュはSGAの一部であり、データファイルから読み込んだデータ・ブロックのコピーが保持される領域です。インスタンスに同時接続されたユーザー・プロセスはすべて、データベース・バッファ・キャッシュへのアクセスを共有します。

データベース・バッファ・キャッシュと共有SQLキャッシュは、論理的にセグメント化されて複数の集合になります。このように複数の集合へ編成すると、マルチ・プロセッサ・システム上での競合が減少します。

データベース・バッファ・キャッシュの編成

このキャッシュのバッファは、次の2つのリストで編成されます。書込みリストおよび最低使用頻度リスト(LRU)です。書込みリストは、使用済バッファを保持します使用済バッファとは、修正されたが、まだディスクに書き込まれていないデータを含むバッファのことです。LRUリストは、使用可能バッファ、使用中バッファおよび書込みリストに移動していない使用済バッファを保持します。使用可能バッファは、有効なデータが含まれておらず、使用可能なバッファです。使用中バッファは、現在アクセスされているバッファです。

Oracleプロセスがバッファにアクセスするとき、プロセスはそのバッファをLRUリストの最高使用頻度(MRU)側に移動します。さらに多くのバッファがLRUリストのMRU側へ移動されるにつれて、使用済バッファはLRUリストのLRU側に向かって古くなります。

Oracleユーザー・プロセスでデータの特定の部分が初めて必要になると、プロセスはデータベース・バッファ・キャッシュ内のデータを検索します。キャッシュ内にデータが見つかった場合(キャッシュ・ヒット)、プロセスはデータをメモリーから直接読み込むことができます。キャッシュ内にデータが見つからなかった場合(キャッシュ・ミス)、プロセスはデータにアクセスする前に、ディスク上のデータファイルからキャッシュ内のバッファにデータ・ブロックをコピーする必要があります。キャッシュ・ヒットによるデータのアクセスは、キャッシュ・ミスによるデータのアクセスよりも高速です。

プロセスはキャッシュ内にデータ・ブロックを読み込む前に、使用可能バッファを見つける必要があります。プロセスは、LRUリストのLRU側から検索を開始します。使用可能バッファが見つかるか、検索したバッファ数が制限しきい値に達するまで、プロセスは検索を続けます。

ユーザー・プロセスがLRUリストの検索時に使用済バッファを見つけた場合、プロセスはそのバッファを書込みリストに移動してから検索を続けます。使用可能バッファが見つかると、プロセスはディスクからバッファにデータ・ブロックを読み込んで、バッファをLRUリストのMRU側に移動します。

使用可能バッファが見つからず、検索したバッファ数が制限しきい値に達すると、Oracleユーザー・プロセスがはLRUリストの検索を停止し、使用済バッファの一部をディスクに書き込むように、DBW0バックグラウンド・プロセスに信号を送ります。

関連項目

DBWnプロセスの詳細は、「データベース・ライター・プロセス(DBWn)」を参照してください。 

LRUアルゴリズムと全表スキャン

ユーザー・プロセスは、全表スキャンを実行するときに、表のブロックをバッファに読み込んでLRUリストの(MRU側ではなく)LRU側に入れます。通常、全表スキャンされた表は一時的に必要なため、使用頻度の高いブロックをキャッシュ内に残しておくために、全表スキャンされた表のブロックをすぐにキャッシュから移動する必要があるためです。

表スキャンに関連するブロックのこのデフォルトの動作は、表ごとに制御できます。全表スキャン時に表のブロックをリストのMRU側に格納するように指定するには、表やクラスタの作成時または変更時にCACHE句を使用します。それ以後の表へのアクセスでI/Oを防止するために、小さな参照表や大きな静的履歴表にこの動作を指定することがあります。

関連項目

CACHE句の詳細は、『Oracle Database SQLリファレンス』を参照してください。 

データベース・バッファ・キャッシュのサイズ

Oracleは、データベース内で複数のブロック・サイズをサポートします。SYSTEM表領域には、標準ブロック・サイズが使用されます。初期化パラメータDB_BLOCK_SIZEを設定して、標準ブロック・サイズを指定します。指定できる値は2Kから32Kです。

オプションで、DB_KEEP_CACHE_SIZEおよびDB_RECYCLE_CACHE_SIZEを設定すると、2つの追加バッファ・プールKEEPおよびRECYCLEのサイズも設定できます。これら3つのパラメータは、互いに独立しています。

関連項目

KEEPおよびRECYCLEバッファ・プールの詳細は、「複数バッファ・プール」を参照してください。 

非標準ブロック・サイズのバッファのサイズと数は、次のパラメータで指定します。

DB_2K_CACHE_SIZE
DB_4K_CACHE_SIZE
DB_8K_CACHE_SIZE
DB_16K_CACHE_SIZE
DB_32K_CACHE_SIZE

各パラメータで、対応するブロック・サイズのキャッシュ・サイズを指定します。


注意

ブロック・サイズの上限値に関してはプラットフォーム固有の制限が適用されるため、プラットフォームによっては指定したサイズが適用できないこともあります。 


ブロック・サイズとキャッシュ・サイズの設定例


DB_BLOCK_SIZE=4096
DB_CACHE_SIZE=1024M
DB_2K_CACHE_SIZE=256M
DB_8K_CACHE_SIZE=512M

前述の例では、パラメータDB_BLOCK_SIZEは、データベースの標準ブロック・サイズを4Kに設定しています。標準ブロック・サイズ・バッファのキャッシュ・サイズは1024MBです。さらに、バッファ・サイズがそれぞれ256MBおよび512MBである2Kおよび8Kのキャッシュも構成されます。


注意

DB_nK_CACHE_SIZEパラメータで標準ブロック・サイズのキャッシュ・サイズを指定することはできません。DB_BLOCK_SIZEの値がnKの場合、DB_nK_CACHE_SIZEに値を設定することはできません。標準ブロック・サイズのキャッシュ・サイズは必ずDB_CACHE_SIZEの値から決定します。 


キャッシュのサイズには制限があるため、ディスク上のすべてのデータをキャッシュに入れられるとはかぎりません。キャッシュがいっぱいになった後でキャッシュ・ミスが発生すると、Oracleは新しいデータ用の領域を確保するために、すでにキャッシュ内にある使用済データをディスクに書き込みます。(バッファが使用済でなければ、新しいブロックをバッファに読み込む前にディスクに書き込む必要はありません。)その後、ディスクに書き込まれたデータにアクセスすると、それもキャッシュ・ミスになります。

データを要求したときにキャッシュ・ヒットになる確率は、キャッシュのサイズによって決まります。キャッシュが大きければ、要求されたデータがキャッシュに入っている可能性は高くなります。キャッシュのサイズを大きくすると、データ要求がキャッシュ・ヒットになる確率が高くなります。

インスタンスの実行時でも、データベースを停止せずにバッファ・キャッシュのサイズを変更できます。この操作にはALTER SYSTEM文を使用します。詳細は、「SGAのメモリーの使用方法の制御」を参照してください。

個々のキャッシュ・コンポーネントのサイズおよび保留中のサイズ変更操作を追跡するには、固定ビューV$BUFFER_POOLを使用します。

関連項目

バッファ・キャッシュのチューニング方法の詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。 

複数バッファ・プール

異なるバッファ・プールを持つデータベース・バッファ・キャッシュを構成して、バッファ・キャッシュ内にデータを保持するか、またはデータ・ブロックの使用直後に新しいデータがバッファを使用するかを指定できます。その後、特定のスキーマ・オブジェクト(表およびクラスタ、索引およびパーティション)を適切なバッファ・プールに割り当てて、キャッシュからデータ・ブロックのエージングを行う方法を制御できます。

KEEPバッファ・プールとRECYCLEバッファ・プールを構成する初期化パラメータは、DB_KEEP_CACHE_SIZEDB_RECYCLE_CACHE_SIZEです。


注意

複数バッファ・プールは、標準ブロック・サイズに対してのみ使用可能です。非標準のブロック・サイズのキャッシュのDEFAULTプールは1つです。 


関連項目

  • 複数バッファ・プールの詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。

  • STORAGE句のBUFFER_POOL句の構文については、『Oracle Database SQLリファレンス』を参照してください。

 

REDOログ・バッファ

REDOログ・バッファとは、SGA内の循環バッファであり、データベースに加えられた変更についての情報を保持します。この情報は、REDOエントリに格納されます。REDOエントリには、INSERTUPDATEDELETECREATEALTERまたはDROPの各操作によってデータベースに加えられた変更の再構築または再実行に必要な情報が含まれます。REDOエントリは、必要に応じてデータベースのリカバリ時に使用されます。

REDOエントリは、Oracleのデータベース・プロセスによってユーザーのメモリー領域からSGA内のREDOログ・バッファにコピーされます。REDOエントリは、バッファ内で連続した領域を占めます。バックグラウンド・プロセスLGWRは、REDOログ・バッファをディスク上のアクティブなREDOログ・ファイル(またはREDOログ・ファイルのグループ)に書き込みます。

関連項目

  • REDOログ・バッファがディスクに書き込まれる方法の詳細は、「ログ・ライター・プロセス(LGWR)」を参照してください。

  • REDOログ・ファイルとグループの詳細は、『Oracle Databaseバックアップおよびリカバリ基礎』を参照してください。

 

初期化パラメータLOG_BUFFERは、REDOログ・バッファのサイズをバイト単位で設定します。一般的に(トランザクションが長いか、数が多い場合には特に)、設定する値を大きくするほどログ・ファイルのI/Oは少なくなります。デフォルト設定は、512KB、または128KBとCPU_COUNTパラメータの設定値を乗算した値のうち、いずれか大きい方です。

共有プール

SGAの共有プール部分には、ライブラリ・キャッシュ、ディクショナリ・キャッシュ、パラレル実行メッセージ用バッファおよび制御構造が含まれます。

共有プールの合計サイズは、初期化パラメータSHARED_POOL_SIZEによって決まります。このパラメータのデフォルト値は、32ビットのプラットフォームでは8MB、64ビットのプラットフォームでは64MBです。このパラメータの値を増やすと共有プール用に確保するメモリー量が増加します。

ライブラリ・キャッシュ

ライブラリ・キャッシュには、共有SQL領域、プライベートSQL領域(共有サーバー構成の場合)、PL/SQLプロシージャおよびパッケージの他、ロックやライブラリ・キャッシュ・ハンドルなどの制御構造が含まれます。

共有SQL領域にはすべてのユーザーがアクセス可能であるため、ライブラリ・キャッシュはSGA内の共有プールに含まれます。

共有SQL領域とプライベートSQL領域

Oracleは、実行する各SQL文を、共有SQL領域とプライベートSQL領域によって表します。Oracleは、2人のユーザーが同じSQL文を実行する場合にそれを認識し、これらのユーザーのために共有SQL領域を再利用します。ただし、各ユーザーは、その文のプライベートSQL領域のコピーを各自で持つ必要があります。

共有SQL領域

共有SQL領域には、特定のSQL文の解析ツリーと実行計画が含まれます。Oracleは、多数のユーザーが同じアプリケーションを実行するときには特に、複数回実行されるSQL文に1つの共有SQL領域を使用することによってメモリーを節約します。

Oracleは、新しいSQL文が解析されると共有プールからメモリーを割り当て、共有SQL領域に格納します。このメモリーのサイズは、文の複雑度に応じて決められます。共有プール全体が割当て済の場合、Oracleは、新しい文の共有SQL領域のための空き領域が十分になるまで、修正したLRUアルゴリズムを使用してその共有プールからエントリの割当てを解除できます。Oracleが共有SQL領域を割当て解除する場合、対応付けられていたSQL文は次の実行時に再解析され、別の共有SQL領域に再び割り当てられます。

関連項目

 

PL/SQLプログラム・ユニットと共有プール

Oracleは、PL/SQLプログラム・ユニット(プロシージャ、ファンクション、パッケージ、無名ブロックおよびデータベース・トリガー)を、個々のSQL文の処理と同様の方法で処理します。プログラム・ユニットを解析およびコンパイル済の形で保持するために、共有領域が割り当てられます。Oracleでは、ローカル変数、グローバル変数、パッケージ変数(パッケージ・インスタンス化とも呼ばれる)およびSQL実行用のバッファなど、プログラム・ユニットを実行するセッションに固有な値を保持するために、プライベート領域が割り当てられます。複数のユーザーが同じプログラム・ユニットを実行している場合、単一の共有領域はすべてのユーザーによって使用されますが、各ユーザーは、自分のセッションに固有の値を保持するプライベートSQL領域のコピーを個別にメンテナンスします。

PL/SQLプログラム・ユニット内に含まれる個々のSQL文は、先の項で説明したように処理されます。PL/SQLプログラム・ユニット内の起点には関係なく、これらのSQL文は解析された表現を保持するために共有領域を使用し、その文を実行するセッションごとにプライベートSQL領域を使用します。

ディクショナリ・キャッシュ

データ・ディクショナリとは、データベース、データベースの構造およびそのユーザーについての参照情報を含むデータベースの表およびビューの集合のことです。Oracleは、SQL文の解析時にデータ・ディクショナリに頻繁にアクセスします。このアクセスは、Oracleの操作を続けるために不可欠です。

データ・ディクショナリはOracleによって頻繁にアクセスされるので、ディクショナリ・データを保持するために、メモリー内に2箇所の特別な場所が指定されています。一方の領域は、データのブロック全体を保持するバッファのかわりに行としてデータを保持するため、データ・ディクショナリ・キャッシュまたは行キャッシュと呼ばれます。ディクショナリ・データを保持するメモリー内の他方の領域は、ライブラリ・キャッシュです。すべてのOracleユーザー・プロセスは、データ・ディクショナリ情報にアクセスするために、これら2つのキャッシュを共有します。

関連項目

 

共有プール内のメモリーの割当てと再利用

一般に、共有プール内のあらゆる項目(共有SQL領域やディクショナリ行)は、修正LRUアルゴリズムに基づいてフラッシュされるまでは、そのまま存在します。新しい項目に領域を割り当てるために共有プール内にさらに領域が必要になると、定期的には使用されていない項目のメモリーが解放されます。修正LRUアルゴリズムを使用すると、多数のセッションが使用している共有プール項目は、その項目を作成したプロセスが終了しても、その項目が使用されているかぎりメモリーに残ります。その結果、マルチユーザーOracleシステムに関連するSQL文のオーバーヘッドと処理が、最小限に抑えられます。

SQL文が実行のためにOracleに送られると、Oracleは次のメモリー割当ての手順を自動的に実行します。

  1. 同一の文について共有SQL領域がすでに存在しているかどうかを確認するため、共有プールをチェックします。その文のための共有SQL領域がすでに存在する場合、その領域は、その文の後続の新しいインスタンスを実行するために使用されます。一方、その文のための共有SQL領域が存在しない場合、Oracleは新しい共有SQL領域を共有プール内に割り当てます。どちらの場合も、ユーザーのプライベートSQL領域が、その文を含む共有SQL領域に対応付けられます。


    注意

    共有SQL領域がオープンしているカーソルに対応していても、しばらく使用されていないカーソルであれば、その共有SQL領域を共有プールからフラッシュできます。オープンしているカーソルが、その後その文を実行するために使用される場合、その文は再解析されて新しい共有SQL領域が共有プール内に割り当てられます。  


  2. セッションのためにプライベートSQL領域を割り当てます。プライベートSQL領域の位置は、セッションのために確立される接続のタイプによって異なります。

Oracleは、次のような場合にも共有SQL領域を共有プールからフラッシュします。

ラージ・プール

データベース管理者は、次の目的で大量のメモリーを割り当てるために、ラージ・プールと呼ばれるオプションのメモリー領域を構成できます。

ラージ・プールからセッション・メモリーを共有サーバー、Oracle XAまたはパラレル問合せバッファ用に割り当てることにより、共有プールと主に共有SQLのキャッシュに使用して、共有SQLキャッシュの縮小によるパフォーマンスのオーバーヘッドを回避できます。

さらに、Oracleのバックアップおよびリストア操作とI/Oサーバー・プロセス用、パラレル・バッファ用のメモリーは、数百KBのバッファ内で割り当てられます。ラージ・プールのほうが、共有プールよりも適切に、これらの大量のメモリー要求を満たすことができます。

ラージ・プールには、LRUリストはありません。これに対して、共有プール内で確保されている領域では、その共有プールから割り当てられる他のメモリーと同じLRUリストが使用されます。

関連項目

  • 共有サーバー用にラージ・プールからセッション・メモリーを割り当てる方法の詳細は、「共有サーバー・アーキテクチャ」を参照してください。

  • Oracle XAの詳細は、『Oracle Databaseアプリケーション開発者ガイド - 基礎編』を参照してください。

  • ラージ・プール、共有プール内の領域確保およびI/Oサーバー・プロセスの詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。

  • パラレル実行用にメモリーを割り当てる方法は、「パラレル実行の概要」を参照してください。

 

Javaプール

Javaプールのメモリーは、サーバー・メモリー内でJVMに含まれるセッション固有のJavaコードとデータすべてに使用されます。Javaプールのメモリーの使用方法は、Oracleサーバーの実行モードに応じて異なります。

Java Pool Advisor統計は、Javaに使用されるライブラリ・キャッシュ・メモリーに関する情報を提供し、Javaプールのサイズの変化が解析率に及ぼす影響を予測します。Java Pool Advisorは、statistics_levelTYPICAL以上に設定すると内部的にオンに設定されます。これらの統計は、アドバイザをオフにするとリセットされます。

関連項目

『Oracle Database Java開発者ガイド』 

ストリーム・プール

1つのデータベース内で、SGA内のストリーム・プールと呼ばれるプールからストリーム・メモリーを割り当てるように指定できます。ストリーム・プールを構成するには、
STREAMS_POOL_SIZE初期化パラメータを使用してプール・サイズをバイト単位で指定します。ストリーム・プールが定義されていない場合、Streamsの初回使用時に自動的に作成されます。

SGA_TARGETが設定されている場合、ストリーム・プールのSGAメモリーはSGAのグローバル・プールから割り当てられます。SGA_TARGETが設定されていない場合、ストリーム・プールのSGAはバッファ・キャッシュから転送されます。この転送は、Streamsの初回使用後にのみ実行されます。転送されるメモリー量は、共有プール・サイズの10%です。

関連項目

『Oracle Streams 概要および管理』 

SGAのメモリーの使用方法の制御

動的SGAでは、Oracleが使用する物理メモリーの増減を外部制御できます。動的バッファ・キャッシュ、共有プールおよびラージ・プールとともに動的SGAでは、次のことが可能です。

その他のSGA初期化パラメータ

複数の初期化パラメータを使用して、SGAによるメモリーの使用方法を制御できます。

物理メモリー

LOCK_SGAパラメータは、SGAを物理メモリーにロックします。

SGA開始アドレス

SHARED_MEMORY_ADDRESSパラメータとHI_SHARED_MEMORY_ADDRESSパラメータは、実行時のSGAの開始アドレスを指定します。これらのパラメータはほとんど使用されません。64ビットのプラットフォームでは、HI_SHARED_MEMORY_ADDRESSは64ビット・アドレスの上位32ビットを指定します。

拡張バッファ・キャッシュ・メカニズム

USE_INDIRECT_DATA_BUFFERSパラメータは、4GBを超える物理メモリーのサポート機能を持った32ビット・プラットフォームで、拡張バッファ・キャッシュ・メカニズムを使用可能にします。 この大容量の物理メモリーをサポートしていないプラットフォームでは、このパラメータは無視されます。

プログラム・グローバル領域の概要

プログラム・グローバル領域(PGA)とは、1つのサーバー・プロセスのためのデータと制御情報を含むメモリー・リージョンです。PGAは、サーバー・プロセスの起動時に、Oracleによって作成される非共有メモリーです。PGAへのアクセスは起動時のサーバー・プロセスに限定され、読込みと書込みはPGAのために機能するOracleコードでのみ行われます。Oracleインスタンスに連結した各サーバー・プロセスにより割り当てられた全PGAメモリーは、インスタンスにより割り当てられた集計PGAメモリーと呼ばれることもあります。

関連項目

セッションについては、「接続とセッション」を参照してください。 

PGAの内容

PGAメモリーの内容は、インスタンスが共有サーバー・オプションを起動しているかどうかにより変わります。しかし、一般的に、PGAメモリーは次のように分類できます。

プライベートSQL領域

プライベートSQL領域は、バインド情報などのデータとランタイム・メモリー構造を格納します。SQL文を発行するそれぞれのセッションには、プライベートSQL領域があります。同一のSQL文を発行するそれぞれのユーザーは、1つの共有SQL領域を使用する専用のプライベートSQL領域を持っています。これにより、プライベートSQL領域の多くは、同一の共有SQL領域に対応付けることができます。

カーソルのプライベートSQL領域は、存続期間が異なる次の2つの領域に分割されます。

Oracleは、実行要求の最初の処理でランタイム領域を作成します。INSERTUPDATEおよびDELETE文では、Oracleは文の実行後にランタイム領域を解放します。問合せの場合、Oracleは、すべての行がフェッチされた後、または問合せが取り消された後にのみ、ランタイム領域を解放します。

プライベートSQL領域の位置は、セッションのために確立される接続のタイプによって異なります。セッションが専用サーバーを介して接続されている場合、プライベートSQL領域はサーバー・プロセスのPGA内にあります。ただし、セッションが共有サーバーを介して接続されている場合、プライベートSQL領域の一部はSGA内に保持されます。

関連項目

 

カーソルとSQL領域

Oracleプリコンパイラ・プログラムやOCIプログラムのアプリケーション開発者は、カーソル、つまり特定のプライベートSQL領域へのハンドルを明示的にオープンし、それらのカーソルをプログラムの実行中に名前付きリソースとして使用できます。Oracleが一部のSQL文のために暗黙的に発行する再帰カーソルも共有SQL領域を使用します。

プライベートSQL領域は、ユーザー・プロセスが管理します。ユーザー・プロセスが割り当てることのできるプライベートSQL領域の数は初期化パラメータOPEN_CURSORSによって制限されますが、プライベートSQL領域の割当ておよび割当て解除は、使用するアプリケーション・ツールに大きく依存します。このパラメータのデフォルト値は50です。

プライベートSQL領域は、対応するカーソルがクローズされるか、文ハンドルが解放されるまで存在します。Oracleは文の実行が完了した後にランタイム領域を解放しますが、持続領域は待機し続けます。持続領域を解放し、アプリケーションのユーザーが必要とするメモリー容量を最小限に抑えるには、オープンされているカーソルのうち再利用しないものを、すべてアプリケーション開発者側でクローズします。

関連項目

「カーソル」 

セッション・メモリー

セッション・メモリーとは、セッションの変数(ログイン情報)およびセッションに関係する他の情報を保持するために割り当てられたメモリーです。共有サーバーでは、セッション・メモリーが共有されます(プライベートではありません)。

SQL作業領域

複雑な問合せでは(たとえば、意思決定支援の問合せ)、次に示すようなメモリー集中型の演算子により、ランタイム領域の大部分が作業領域に専用に割り当てられます。

たとえば、ソート演算子は作業領域(ソート領域とも呼ばれます使用して、行の集合のメモリー内ソートを実行します。同様に、ハッシュ結合演算子も作業領域(ハッシュ領域とも呼ばれます使用して、左入力からハッシュ表を構築します。これら2つの演算子で処理するデータが作業領域に収まらない場合は、入力データを小さく分割します。これにより、メモリー内でデータの一部を処理できます。残りのデータは、処理待ちとして一時ディスク記憶域に収められます。ビットマップ演算子では、対応する作業領域が非常に小さい場合でもディスクに収まらないことはありませんが、ビットマップ演算の複雑度は使用する作業領域のサイズに反比例します。このため、これらの演算子は、作業領域が大きくなればより高速に実行できます。

作業領域のサイズは、制御およびチューニング可能です。通常、データベース領域を増やすとメモリーの使用は増えるものの、演算子の種類によってはパフォーマンスが著しく改善されます。オプションの使用により、入力データや関連のSQL演算子が割り当てた補助メモリー構造に応じた作業領域のサイズを十分確保できます。このオプションを使用しない場合、一部の入力データが一時ディスク記憶域に収容できなくなるため、応答時間が長くなります。作業領域のサイズが入力データ・サイズに比べ、きわめて小さい場合は、データを分割して複数に分けて渡すことが必要となります。このため、演算子の応答時間が大幅に増加します。

専用モードに対するPGAメモリー管理

SQL作業領域を、自動的かつグローバルに管理できます。データベース管理者は、初期化パラメータPGA_AGGREGATE_TARGETを設定し、Oracleインスタンス専用のPGAメモリーの合計サイズを指定します。指定した数値(たとえば、2G)は、Oracleインスタンスのグローバル・ターゲットであるため、Oracleは、すべてのデータベース・サーバー・プロセスに割り当てたPGAメモリーの合計がこのターゲット値を超えないことを確認します。


注意

以前のリリースでは、データベース管理者はパラメータSORT_AREA_SIZEHASH_AREA_SIZEBITMAP_MERGE_AREA_SIZEおよびCREATE_BITMAP_AREA_SIZEを設定することで、SQL作業領域の最大サイズを制御していました。ただし、最大作業領域サイズは、データ入力サイズとシステム内でアクティブな作業領域の合計数から選択するのが理想であるため、これらのパラメータの設定は困難です。これら2つの要因は、作業領域および時間により大幅に変動します。このため、各種*_AREA_SIZEパラメータを最適な状況の下でチューニングすることは困難です。 


PGA_AGGREGATE_TARGETを使用すると、すべての専用セッションの作業領域のサイズ設定が自動的に行われ、これらのセッションについてはすべての*_AREA_SIZEパラメータが無視されます。ある時点での、インスタンスのアクティブな作業領域で使用可能なPGAメモリーの合計は、パラメータPGA_AGGREGATE_TARGETから自動的に導出されます。この量は、PGA_AGGREGATE_TARGETの値から、システムの他の構成要素により割り当てられたPGAメモリー(たとえば、セッションにより割り当てられたPGAメモリー)を差し引いた値に設定されます。結果として、PGAメモリーは、特定のメモリー要件に基づいて個々のアクティブな作業領域に割り当てられます。


注意

初期化パラメータWORKAREA_SIZE_POLICYは、セッション・レベルおよびシステム・レベルのパラメータで、設定できる値はMANUALまたはAUTOの2つのみです。デフォルトはAUTOです。データベース管理者は、PGA_AGGREGATE_TARGETを設定して、次にメモリー管理モードを自動から手動に切り替えます。 


PGAメモリーの使用統計を提供する固定ビューと列が用意されています。これらの統計の多くは、PGA_AGGREGATE_TARGETを設定することで使用できます。

専用サーバーと共有サーバー

システムが使用するアーキテクチャが専用サーバーなのか、共有サーバーなのかにより、メモリーの割当て方法が変わることがあります。表8-1にこれらの相違点を示しています。

表 8-1     専用サーバーと共有サーバーのメモリー割当て方法の相違点
メモリー領域  専用サーバー  共有サーバー 

セッション・メモリーの性質 

プライベート 

共有 

持続領域の位置 

PGA 

SGA 

SELECT文の一部のランタイム領域の位置 

PGA 

PGA 

DML/DDL文のランタイム領域の位置 

PGA 

PGA 

ソフトウェア・コード領域

ソフトウェア・コード領域とは、実行中または実行される可能性があるコードを格納するためのメモリー部分です。Oracleのコードはソフトウェア領域に格納されますが、これはユーザー・プログラムが格納される領域の位置とは異なる位置、つまり排他的で保護された位置になります。

ソフトウェア領域のサイズは通常固定されており、ソフトウェアの更新時か再インストール時にかぎり変化します。これらの領域に必要なサイズは、オペレーティング・システムによって異なります。

ソフトウェア領域は読取り専用であり、共有または非共有でインストールされます。可能なときには、メモリー内にOracleコードの複数のコピーを持たずにすべてのOracleユーザーがOracleコードにアクセスできるようにするため、Oracleコードは共有されます。これにより、実際の主メモリーが節約され、全体のパフォーマンスが改善されます。

ユーザー・プログラムは共有でも非共有でもかまいません。Oracle FormsやSQL*PlusなどのOracleのツール製品およびユーティリティによっては、共有でインストールできるものもありますが、共有にできないものもあります。Oracleの複数のインスタンスが同じコンピュータ上で実行されている場合、それらのインスタンスは異なるデータベースにおいても同じOracleコード領域を使用できます。


注意

ソフトウェアを共有でインストールするオプションは、すべてのオペレーティング・システムで使用できるわけではありません(たとえば、Windowsが稼働しているPCでは使用できません)。

詳細は、オペレーティング・システム固有のOracleマニュアルを参照してください。 



戻る 次へ
Oracle
Copyright © 2006 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引