| Oracle Database 管理者ガイド 11gリリース1(11.1) E05760-03 |
|
この章の内容は次のとおりです。
メモリー管理には、データベースの変更に応じたOracle Databaseインスタンス・メモリー構造の最適なサイズのメンテナンスが含まれます。管理する必要があるメモリー構造は、システム・グローバル領域(SGA)とインスタンス・プログラム・グローバル領域(インスタンスPGA)です。
Oracle Databaseでは様々なメモリー管理方法がサポートされており、これらは初期化パラメータの設定で選択されます。自動メモリー管理と呼ばれる方法を使用可能にすることをお薦めします。
リリース11gからは、Oracle DatabaseでSGAメモリーとインスタンスPGAメモリーを完全に自動的に管理できます。ユーザーが指定するのはインスタンスで使用する合計メモリー・サイズのみです。Oracle Databaseによって、処理要求にあわせてSGAとインスタンスPGAの間でメモリーが動的に交換されます。この機能は自動メモリー管理と呼ばれます。このメモリー管理方法を使用すると、個々のSGAコンポーネントのサイズおよび個々のPGAのサイズも動的にチューニングされます。
個々のメモリー・コンポーネントのサイズをより直接的に制御する場合は、自動メモリー管理を使用禁止にして、手動メモリー管理用にデータベースを構成できます。手動メモリー管理として使用できる方法はいくつかあります。これらの方法には、自動の部分が、ある度合で残っているものがあります。それらの方法では、DBAに要求される作業量および知識量が異なります。次の方法があります。
これらのメモリー管理方法については、この章で後述します。
Oracle Databaseに関連する基本的なメモリー構造は、次のとおりです。
SGAは、SGAコンポーネントと呼ばれる共有メモリー構造のグループで、1つのOracle Databaseインスタンスに対するデータと制御情報が含まれています。SGAは、すべてのサーバー・プロセスおよびバックグラウンド・プロセスで共有されます。SGAに格納されるデータの例には、キャッシュ・データ・ブロックや共有SQL領域があります。
PGAは、1つのサーバー・プロセスに対するデータと制御情報を含むメモリー・リージョンです。サーバー・プロセスの起動時に、Oracle Databaseによって作成される非共有メモリーです。PGAへのアクセスはそのサーバー・プロセスに限定されます。サーバー・プロセスごとに1つのPGAがあります。また、バックグラウンド・プロセスでも独自のPGAが割り当てられます。Oracle Databaseインスタンスに連結されたすべてのバックグラウンド・プロセスおよびサーバー・プロセスに対して割り当てられたPGAメモリーの合計は、合計インスタンスPGAメモリーと呼ばれます。また、個々のPGAすべての集合は、合計インスタンスPGAまたは単にインスタンスPGAと呼ばれます。
図5-1に、これらのメモリー構造の関係を示します。
ここでは、Oracle Databaseの自動メモリー管理機能のバックグラウンド情報を提供し、この機能を使用可能にする方法を示します。この項の内容は、次のとおりです。
インスタンス・メモリーを管理する最も単純な方法は、Oracle Databaseインスタンスで自動的に管理およびチューニングされるようにすることです。(ほとんどのプラットフォームで)このために必要な処理は、ターゲット・メモリー・サイズ初期化パラメータ(MEMORY_TARGET)と、オプションで最大メモリー・サイズ初期化パラメータ(MEMORY_MAX_TARGET)を設定することのみです。この結果、インスタンスによってターゲット・メモリー・サイズにチューニングされ、システム・グローバル領域(SGA)とインスタンス・プログラム・グローバル領域(インスタンスPGA)の間で、必要に応じてメモリーが再配分されます。ターゲット・メモリー初期化パラメータは動的であるため、ターゲット・メモリー・サイズは、データベースを再起動することなくいつでも変更できます。最大メモリー・サイズは、ターゲット・メモリー・サイズを誤って大きく設定しすぎないように、また、合計インスタンス・メモリーを今後増やす場合に、Oracle Databaseインスタンス用に十分なメモリーを確保しておくために、上限の役割を果たします。特定のSGAコンポーネントは容易に縮小できないため、または最小サイズで残しておく必要があるため、インスタンスによって、ユーザーがターゲット・メモリー・サイズを小さく設定しすぎないように制御されます。
Database Configuration Assistant(DBCA)を使用してデータベースを作成する際に基本インストール・オプションを選択した場合は、自動メモリー管理が使用可能になります。拡張インストールを選択した場合は、Database Configuration Assistant(DBCA)を使用して自動メモリー管理を選択できます。
データベースの作成時に(DBCAで適切なオプションを選択して、またはCREATE DATABASE SQL文に適切な初期化パラメータを設定して)自動メモリー管理を使用可能にしなかった場合は、後で自動メモリー管理を使用可能にできます。自動メモリー管理を使用可能にする場合は、データベースを停止して再起動する必要があります。
SYSDBAユーザーとしてデータベースに接続します。手順については、「DBAのセキュリティと権限の概要」および「DBAの認証」を参照してください。
MEMORY_TARGETの最小値を次の方法で計算します。
SGA_TARGETおよびPGA_AGGREGATE_TARGETの現行サイズを確認します。
SHOW PARAMETER TARGET
SQL*Plusによって、すべての初期化パラメータの値が、パラメータ名にTARGETが付加されて表示されます。
NAME TYPE VALUE ------------------------------ ----------- ---------------- archive_lag_target integer 0 db_flashback_retention_target integer 1440 fast_start_io_target integer 0 fast_start_mttr_target integer 0 memory_max_target big integer 0 memory_target big integer 0 pga_aggregate_target big integer 90M sga_target big integer 272M
select value from v$pgastat where name='maximum PGA allocated';
PGA_AGGREGATE_TARGETから最大値を算出します。この値にSGA_TARGETを加算します。
memory_target = sga_target + max(pga_aggregate_target, maximum PGA allocated)
たとえば、前述のようにSGA_TARGETが272M、PGA_AGGREGATE_TARGETが90Mで、割当て済の最大PGAが120Mと確認された場合、MEMORY_TARGETは392M (272M + 120M)以上にする必要があります。
MEMORY_TARGETの値を選択します。この値は、手順2で計算した最小値にするか、または使用可能な物理メモリーが十分ある場合はこれより大きい値を使用できます。
MEMORY_MAX_TARGET初期化パラメータについては、予測可能な範囲で、データベースに割り当てる予定の最大メモリー量に決定します。つまり、SGAとインスタンスPGAサイズの合計に対する最大値を決定します。この値は、前述の手順で選択したMEMORY_TARGETの値以上に設定できます。
ALTER SYSTEM SET MEMORY_MAX_TARGET = nM SCOPE = SPFILE;
nは手順4で計算した値です。
SCOPE = SPFILE句を指定すると、サーバー・パラメータ・ファイル内の値のみが設定され、実行中のインスタンスに対する値は設定されません。MEMORY_MAX_TARGETは動的な初期化パラメータではないため、このSCOPE句を組み込む必要があります。
memory_max_target = nM memory_target = mM
手順については、第3章「起動と停止」を参照してください。
ALTER SYSTEM SET MEMORY_TARGET = nM; ALTER SYSTEM SET SGA_TARGET = 0; ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0;
nは手順3で決定した値です。
動的なパフォーマンス・ビューV$MEMORY_DYNAMIC_COMPONENTSに、SGAとインスタンスPGAの合計サイズなど、動的にチューニングされたすべてのメモリー・コンポーネントの現行サイズが示されます。
ビューV$MEMORY_TARGET_ADVICEでは、MEMORY_TARGET初期化パラメータに対するチューニング・アドバイスが提供されます。
SQL> select * from v$memory_target_advice order by memory_size; MEMORY_SIZE MEMORY_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR VERSION ----------- ------------------ ------------ ------------------- ---------- 180 .5 458 1.344 0 270 .75 367 1.0761 0 360 1 341 1 0 450 1.25 335 .9817 0 540 1.5 335 .9817 0 630 1.75 335 .9817 0 720 2 335 .9817 0
MEMORY_SIZE_FACTORが1の行には、MEMORY_TARGET初期化パラメータで設定されたメモリーの現行サイズ、および現行のワークロードを完了するために必要なDB時間の量が示されています。上下の行の結果には、MEMORY_TARGETの代替サイズの数値が示されています。各代替サイズについて、サイズ・ファクタ(現行サイズの乗数)、MEMORY_TARGETパラメータが代替サイズに変更された場合に現行のワークロードを完了するために必要な見積DB時間が示されます。合計メモリー・サイズがMEMORY_TARGETの現行サイズより小さい場合は、見積DB時間が増加していることに注意してください。また、この例では、合計メモリー・サイズを450MBより大きくしても効果がないことに注意してください。ただし、ワークロード全体がまだ実行されていない場合、この状況は変わる可能性があります。
Enterprise Managerには、MEMORY_TARGETの最適なサイズを選択できる使いやすいグラフィカル・メモリー・アドバイザが用意されています。 詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。
個々のメモリー・コンポーネントのサイズをより直接的に制御する場合は、自動メモリー管理を使用禁止にして、手動メモリー管理用にデータベースを構成できます。SGAおよびインスタンスPGAについて、それぞれ2つの異なる手動メモリー管理方法があります。
SGAの2つの手動メモリー管理方法では、DBAに要求される作業量および知識量が異なります。自動共有メモリー管理では、DBAがSGAのターゲット・サイズと最大サイズを設定します。設定後、データベースによって、SGAの合計サイズが指定したターゲットにチューニングされ、多数のSGAコンポーネントのサイズが動的にチューニングされます。手動共有メモリー管理では、DBAが個々のいくつかのSGAコンポーネントのサイズを設定し、その結果、SGAサイズ全体を決定します。その後は、変動する基準に基づいて、これらの個々のSGAコンポーネントを手動でチューニングします。
インスタンスPGAの場合は自動PGAメモリー管理があり、この方法ではDBAがインスタンスPGAのターゲット・サイズを設定します。設定後、データベースによって、インスタンスPGAのサイズが指定したターゲットにチューニングされ、個々のPGAのサイズが動的にチューニングされます。また、手動PGAメモリー管理もあり、この方法では、DBAが各SQL演算子タイプ(sortまたはhash-joinなど)の最大作業領域サイズを設定します。このメモリー管理方法は、サポートされていますがお薦めしません。
次の各項では、これらの手動メモリー管理方法すべてについて詳細に説明します。
この項の内容は、次のとおりです。
自動共有メモリー管理によってSGAメモリー管理が簡素化されます。SGA_TARGET初期化パラメータを使用してインスタンスに使用可能なSGAメモリーの合計量を指定すると、Oracle Databaseによって、メモリーが最も効率的に使用されるように、このメモリーが様々なSGAコンポーネントに自動的に配分されます。
自動共有メモリー管理が使用可能な場合、様々なSGAコンポーネントのサイズは自由に変更され、ワークロードのニーズにあわせてチューニングされるため、追加構成の必要はありません。データベースによって、必要に応じて使用可能なメモリーが様々なコンポーネントに自動的に配分されるため、システムでは使用可能なすべてのSGAメモリーを最大限に使用できます。
サーバー・パラメータ・ファイル(SPFILE)を使用している場合、Oracle Databaseでは、自動チューニングされたコンポーネントのサイズがインスタンス停止後も保持されます。このため、システムでは、インスタンスが起動するたびにワークロードの特性を再度認識する必要があります。過去のインスタンスの情報に基づいて、前回インスタンスが停止した時点でのワークロードを継続して評価できます。
SGAは、特定のクラスのメモリー割当て要求を満たすために使用されるメモリーのプールである多数のメモリー・コンポーネントで構成されます。メモリー・コンポーネントの例として、共有プール(SQLおよびPL/SQL実行のメモリー割当てに使用)、Javaプール(Javaオブジェクトおよびその他のJava実行メモリーに使用)、およびバッファ・キャッシュ(キャッシュ・ディスク・ブロックに使用)などがあります。すべてのSGAコンポーネントがグラニュルという単位で領域を割当ておよび割当て解除します。Oracle Databaseは、各SGAコンポーネントに対するグラニュルの内部数でSGAメモリーの使用状況を追跡します。
SGAの動的コンポーネント用のメモリーは、グラニュル単位で割り当てられます。グラニュル・サイズは、合計SGAサイズにより決定されます。一般に、ほとんどのプラットフォームでは、合計SGAサイズが1GB以下の場合、グラニュル・サイズは4MBです。1GBより大きいSGAのグラニュル・サイズは16MBです。一部にプラットフォーム依存性が存在する場合があります。たとえば、32ビットのWindows NTの場合、1GBより大きいSGAのグラニュル・サイズは8MBです。詳細は、使用しているオペレーティング・システム固有のマニュアルを参照してください。
V$SGAINFOビューを問い合せると、インスタンスで使用中のグラニュル・サイズを確認できます。SGAのすべてのコンポーネントに、同じグラニュル・サイズが使用されます。
コンポーネントに対してグラニュル・サイズの倍数でないサイズを指定すると、そのサイズは最も近い倍数に繰り上げられます。たとえば、グラニュル・サイズが4MBの場合にDB_CACHE_SIZEを10MBとして指定すると、実際には12MBが割り当てられます。
インスタンスの存続期間中のSGAの最大サイズは、SGA_MAX_SIZE初期化パラメータによって決まります。バッファ・キャッシュ、共有プール、ラージ・プール、JavaプールおよびStreamsプールのサイズに影響を与える初期化パラメータは動的に変更できますが、これらのサイズとSGAの他のコンポーネント(固定SGA、可変SGAおよびREDOログ・バッファ)のサイズとの合計が、SGA_MAX_SIZEで指定された値を超えるような変更はできません。
SGA_MAX_SIZEが指定されていない場合は、初期化時に指定またはデフォルト設定されたコンポーネントすべての合計がデフォルト値として選択されます。SGA_MAX_SIZEに指定した値が、データベースの初期化時に、すべてのコンポーネントに対してパラメータ・ファイルで明示的にまたはデフォルトで割り当てたメモリーの合計より少ない場合、SGA_MAX_SIZEの設定は無視され、このパラメータに対する適切な値が選択されます。
自動共有メモリー管理機能を使用可能にするには、SGA_TARGETパラメータを0(ゼロ)以外の値に設定します。このパラメータは実際には、個別コンポーネントの特定のセットに対して割り当てられるメモリーを制御するパラメータを置換します。この割当ては現在、必要に応じて自動的かつ動的にサイズ変更(チューニング)されています。
SGA_TARGET初期化パラメータには、SGAの合計サイズが反映されます。表5-1に、SGA_TARGETにメモリーが含まれるコンポーネント(自動サイズ設定SGAコンポーネント)と、コンポーネントに対応する初期化パラメータを示します。
| SGAコンポーネント | 初期化パラメータ |
|---|---|
|
固定SGAおよびOracle Databaseインスタンスに必要なその他の内部割当て |
N/A |
|
共有プール |
|
|
ラージ・プール |
|
|
Javaプール |
|
|
バッファ・キャッシュ |
|
|
Streamsプール |
|
表5-2にリストされているパラメータは、設定された場合、SGA_TARGETからメモリーを取得しますが、表5-1にリストされたコンポーネントに使用されるメモリーは残されます。
| SGAコンポーネント | 初期化パラメータ |
|---|---|
|
ログ・バッファ |
|
|
KEEPバッファ・キャッシュおよびRECYCLEバッファ・キャッシュ |
|
|
非標準ブロック・サイズ・バッファ・キャッシュ |
|
SGA_TARGETを0(ゼロ)以外の値に設定する他に、すべての自動サイズ設定SGAコンポーネントの値を0(ゼロ)に設定して、これらのコンポーネントの完全な自動チューニングを使用可能にする必要があります。
また、1つ以上の自動サイズ設定SGAコンポーネントの値を0(ゼロ)以外に設定することもできます。この結果、SGAのチューニング時にこの値がこのコンポーネントの最小設定として使用されます。この操作については、この項の後半を参照してください。
ほとんどのシステムで最適なパフォーマンスを実現するには、SGA全体が実メモリーに収まる必要があります。実メモリーに収まらず、その一部を格納するために仮想メモリーが使用される場合は、データベース・システム全体のパフォーマンスが大幅に低下する可能性があります。これは、オペレーティング・システムによってSGAの一部でページング(ディスクの読取りおよび書込み)が実行されるためです。
ページング・アクティビティを監視する方法は、使用しているオペレーティング・システムのマニュアルを参照してください。また、Enterprise Managerの「ホスト」ページの「パフォーマンス」プロパティ・ページからページング・アクティビティを表示することもできます。
V$SGAINFOビューでは、様々なSGAコンポーネントの現行のチューニング・サイズに関する情報が提供されます。
V$SGA_TARGET_ADVICEビューでは、SGA_TARGETの値の決定に役立つ情報が提供されます。
SQL> select * from v$sga_target_advice order by sga_size; SGA_SIZE SGA_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR ESTD_PHYSICAL_READS ---------- --------------- ------------ ------------------- ------------------- 290 .5 448176 1.6578 1636103 435 .75 339336 1.2552 1636103 580 1 270344 1 1201780 725 1.25 239038 .8842 907584 870 1.5 211517 .7824 513881 1015 1.75 201866 .7467 513881 1160 2 200703 .7424 513881
このビューの情報は、自動メモリー管理用のV$MEMORY_TARGET_ADVICEビューで提供される情報と同じです。このビューについては、「自動メモリー管理の監視およびチューニング」を参照してください。
Enterprise Managerには、SGA_TARGETの最適なサイズを選択できる使いやすいグラフィカル・メモリー・アドバイザが用意されています。 詳細は、『Oracle Database 2日でデータベース管理者』を参照してください。
自動共有メモリー管理(ASMM)を使用可能にする手順は、手動共有メモリー管理からASMMに変更するか、自動メモリー管理からASMMに変更するかによって異なります。
手動共有メモリー管理からASMMに変更する手順は、次のとおりです。
SGA_TARGETの値を取得します。
SELECT ( (SELECT SUM(value) FROM V$SGA) - (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY) ) "SGA_TARGET" FROM DUAL;
SGA_TARGETの値を設定します。
ALTER SYSTEM SET SGA_TARGET=value [SCOPE={SPFILE|MEMORY|BOTH}]
valueは手順1で計算した値、またはすべてのSGAコンポーネント・サイズの合計とSGA_MAX_SIZEの間の値です。 ALTER SYSTEM文とそのSCOPE句の詳細は、『Oracle Database SQLリファレンス』を参照してください。
ALTER SYSTEM文を発行します。
ALTER SYSTEM文を発行します。
自動メモリー管理からASMMに変更する手順は、次のとおりです。
MEMORY_TARGET初期化パラメータを0(ゼロ)に設定します。
ALTER SYSTEM SET MEMORY_TARGET = 0;
データベースによって、現在のSGAメモリー割当てに基づいてSGA_TARGETが設定されます。
ALTER SYSTEM文を発行します。
ALTER SYSTEM文を発行します。
たとえば、手動共有メモリー管理用にインスタンスのパラメータが現在次のように構成されていて、SGA_MAX_SIZEが1200Mに設定されているとします。
また、問合せが次のような結果であるとします。
| 問合せ | 結果 |
|---|---|
|
|
1200M |
|
|
208M |
Oracle Enterprise Managerで合計SGAサイズを992Mに設定するか、次の文を発行することによって、自動共有メモリー管理を利用できます。
ALTER SYSTEM SET SGA_TARGET = 992M; ALTER SYSTEM SET SHARED_POOL_SIZE = 0; ALTER SYSTEM SET LARGE_POOL_SIZE = 0; ALTER SYSTEM SET JAVA_POOL_SIZE = 0; ALTER SYSTEM SET DB_CACHE_SIZE = 0; ALTER SYSTEM SET STREAMS_POOL_SIZE = 0;
992Mは、1200M - 208Mから算出された値です。
ここでは、自動共有メモリー管理についてさらに詳細に説明します。この項の内容は、次のとおりです。
自動サイズ設定SGAコンポーネントに対応するパラメータに最小値を指定して、これらのコンポーネントのサイズをある程度制御できます。この設定は、特定のコンポーネントで最低限のメモリーが確保されていないとアプリケーションが正しく動作しないことがわかっている場合に便利です。コンポーネントに対してSGA領域の最小量を指定するには、対応する初期化パラメータの値を設定します。
1つ以上の自動サイズ設定コンポーネントの最小サイズを手動で制限すると、動的な調整に使用されるメモリーの合計量が減少します。この量が減少すると、システムがワークロードの変動に適応するシステムの機能が次々に制限されます。したがって、この方法は特別な場合を除いてお薦めしません。デフォルトの自動管理は、システム・パフォーマンスおよび使用可能なリソースの使用が最大になるように動作します。
自動共有メモリー管理機能を使用可能にすると、内部チューニング・アルゴリズムにより、ワークロードに基づいて共有プールの最適サイズが決定されます。通常、値を少しずつ徐々に増加することにより、この値に収束していきます。ただし、内部チューニング・アルゴリズムでは通常、共有プールは縮小されません。これは、共有プール内にオープン・カーソル、確保されたPL/SQLパッケージおよびその他のSQL実行状態が存在することによって、解放可能なグラニュルを検出できないためです。このため、内部チューニング・アルゴリズムでは、共有プールの控えめな増分のみが行われます。控えめなサイズから開始し、パフォーマンスが最適になったサイズで共有プールを安定させます。
SGA_TARGETパラメータは、SGA_MAX_SIZEパラメータに指定された値まで動的に増やすことができ、減らすこともできます。SGA_TARGETの値を減らした場合は、メモリーを解放する1つ以上の自動調整コンポーネントがシステムによって識別されます。SGA_TARGETは、1つ以上の自動調整コンポーネントがその最小サイズに達するまで減らすことができます。Oracle Databaseでは、SGA_TARGETの最小許容値を決定するときに、自動サイズ設定コンポーネントに設定された値、SGA_TARGET領域を使用する手動サイズ設定コンポーネント、およびCPUの数など、いくつかの要因が考慮されます。
SGA_TARGETが変更されたときに、消費される物理メモリーの量の変更は、オペレーティング・システムによって異なります。動的共有メモリーをサポートしない一部のUNIXプラットフォームでは、SGAで使用される物理メモリーはSGA_MAX_SIZEパラメータの値と同じです。SGA_TARGETをSGA_MAX_SIZEより小さい値に設定した場合、このようなプラットフォームでは実際の利点はありません。したがって、これらのプラットフォームでは、SGA_MAX_SIZEを設定しないことをお薦めします。
SolarisやWindowsなどの他のプラットフォームでは、SGAで消費される物理メモリーはSGA_TARGETと同じです。
たとえば、次のような構成環境とします。
この例では、SGA_TARGETは1024Mまでサイズを増やすことができ、自動サイズ設定コンポーネントの1つ以上がその最小サイズに達するまでサイズを減らすこともできます。正確な値は、システムのCPU数などの環境要因によって決定します。ただし、DB_8K_CACHE_SIZEの値は常に128Mで固定です。
SGA_TARGETが設定されていない場合、自動共有メモリー管理機能は使用できません。したがって、すべてのコンポーネント・パラメータのサイズ変更に関するルールは以前のリリースの場合と同じです。ただし、自動共有メモリー管理が有効な場合は、自動的にサイズ変更したコンポーネントについて手動で指定したサイズが、そのコンポーネントの下限のサイズとして機能します。この制限は、対応するパラメータの値を変更することで動的に変更できます。
特定のSGAコンポーネントに指定したサイズの下限が、現在のサイズより小さい場合、そのコンポーネントのサイズはすぐには変更されません。新しい設定は自動チューニング・アルゴリズムを将来において減少した最小サイズに制限するのみです。たとえば、次のような構成を考えてみます。
この例では、LARGE_POOL_SIZEの値をコンポーネントの現行の実際のサイズを超える値に増加した場合は、増加した最小サイズを格納するためにコンポーネントが拡張されます。たとえば、LARGE_POOL_SIZEの値を300Mに増やした場合、ラージ・プールは300Mに達するまで段階的に拡張されます。このサイズ変更は、1つ以上の自動チューニング・コンポーネントに影響を与えます。
LARGE_POOL_SIZEの値を200まで減らしても、コンポーネントのサイズが即時に変更されることはありません。この新しい設定は、将来ラージ・プールが減らされる限度を200Mまでに制限するのみです。
手動サイズ設定コンポーネントのパラメータも動的に変更できます。ただし、最小サイズは設定しないで、パラメータの値によって、対応するコンポーネントの正確なサイズを指定します。手動サイズ設定コンポーネントのサイズを増やすと、余分なメモリーが1つ以上の自動サイズ設定コンポーネントから削除されます。手動サイズ設定コンポーネントのサイズを減らすと、解放されたメモリーが複数の自動サイズ設定コンポーネントに提供されます。
たとえば、次のような構成を考えてみます。
この例のDB_8K_CACHE_SIZEを16M増やして144Mにすると、その16Mが、自動サイズ設定コンポーネントから削除されます。同様に、DB_8K_CACHE_SIZEを16M減らして112Mにすると、その16Mが、自動サイズ設定コンポーネントに提供されます。
自動メモリー管理または自動共有メモリー管理を使用しない場合は、いくつかのSGAコンポーネントのサイズを手動で構成し、データベース・ワークロードの変更に基づいてこれらのサイズを監視およびチューニングする必要があります。ここでは、これらのSGAコンポーネントのサイズを制御するパラメータの設定ガイドラインを提供します。
DBCAを使用してデータベースを作成し、手動共有メモリー管理を選択している場合は、DBCAによって、バッファ・キャッシュ、共有プール、ラージ・プールおよびJavaプールのサイズを入力する必要があるフィールドが提供されます。また、作成されるサーバー・パラメータ・ファイル(SPFILE)に、対応する初期化パラメータが設定されます。この方法ではなくCREATE DATABASE SQL文とテキスト形式のパラメータ・ファイルを使用してデータベースを作成する場合は、次のいずれかを実行できます。
この項の内容は、次のとおりです。
手動共有メモリー管理自体を使用可能にする初期化パラメータはありません。自動メモリー管理と自動共有メモリー管理の両方を使用禁止にすることによって、手動共有メモリー管理が事実上使用可能になります。
手動共有メモリー管理を使用可能にする手順は、次のとおりです。
次に、以降の項の説明に従って、様々なSGAコンポーネントの値を設定する必要があります。
SGAコンポーネントであるバッファ・キャッシュのサイズは、バッファ・キャッシュ初期化パラメータによって決まります。これらのパラメータを使用して、データベースで使用される各ブロック・サイズのキャッシュ・サイズを指定します。これらの初期化パラメータはすべて動的です。
バッファ・キャッシュのサイズはパフォーマンスに影響を及ぼします。一般に、キャッシュ・サイズを大きくすると、ディスクの読取りと書込みの回数が少なくなります。ただし、キャッシュを大きくすると、メモリーを過度に消費してページングやスワッピングが発生する可能性があります。
Oracle Databaseでは、データベース内で複数のブロック・サイズがサポートされます。非標準のブロック・サイズを設定した表領域を作成する場合は、これらの表領域を格納するための非標準のブロック・サイズ・バッファを構成する必要があります。SYSTEM表領域には標準のブロック・サイズが使用されます。標準のブロック・サイズを指定するには、初期化パラメータDB_BLOCK_SIZEを設定します。指定できる値は2Kから32Kです。
データベースで複数のブロック・サイズを使用する場合は、DB_CACHE_SIZEと、少なくとも1つのDB_nK_CACHE_SIZEパラメータを設定する必要があります。Oracle Databaseは、DB_CACHE_SIZEパラメータに適切なデフォルト値を割り当てますが、DB_nK_CACHE_SIZEパラメータはデフォルトで0(ゼロ)に設定され、追加のブロック・サイズ・キャッシュは構成されません。
非標準のブロック・サイズ・バッファのサイズおよび数は、次のパラメータによって指定します。
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です。また、2KBおよび8KBのキャッシュ・サイズがそれぞれ256MBと512MBで構成されます。
キャッシュのサイズには制限があるため、ディスク上のすべてのデータをキャッシュに入れられるとはかぎりません。キャッシュがいっぱいになると、その後キャッシュ・ミスが発生し、Oracle Databaseは新しいデータ用の領域を確保するために、キャッシュ内の使用済データをディスクに書き込みます(バッファが使用済でなければ、新しいブロックをバッファに読み取るためのディスクへの書込みは行われません)。ディスクへの書込みにより上書きされたデータにアクセスすると、さらにキャッシュ・ミスが発生します。
キャッシュのサイズは、データを要求したときにキャッシュ・ヒットになる確率に影響します。キャッシュが大きい場合は、要求されたデータがキャッシュに入っている可能性が高くなります。キャッシュのサイズを大きくすると、データ要求がキャッシュ・ヒットになる確率が高くなります。
インスタンスの実行中も、データベースを停止せずにバッファ・キャッシュのサイズを変更できます。この操作にはALTER SYSTEM文を使用します。
個々のキャッシュ・コンポーネントのサイズおよび保留中のサイズ変更操作を追跡するには、固定ビューV$BUFFER_POOLを使用します。
異なるバッファ・プールを持つデータベース・バッファ・キャッシュを構成して、バッファ・キャッシュ内にデータを保持するか、またはデータ・ブロックの使用直後に新しいデータがバッファを使用できるようにするかを指定できます。その後、特定のスキーマ・オブジェクト(表、クラスタ、索引およびパーティション)を適切なバッファ・プールに割り当て、キャッシュからデータ・ブロックをエージ・アウトする方法を制御できます。
KEEPバッファ・プールでは、スキーマ・オブジェクトのデータ・ブロックがメモリーに保持されます。
RECYCLEバッファ・プールでは、データ・ブロックが不要になるとすぐにメモリーから除去されます。
DEFAULTバッファ・プールには、いずれのバッファ・プールにも割り当てられていないスキーマ・オブジェクトのデータ・ブロックと、明示的にDEFAULTプールに割り当てられたスキーマ・オブジェクトのデータ・ブロックが含まれます。
KEEPバッファ・プールとRECYCLEバッファ・プールを構成する初期化パラメータは、DB_KEEP_CACHE_SIZEとDB_RECYCLE_CACHE_SIZEです。
SHARED_POOL_SIZE初期化パラメータは、SGAのコンポーネントである共有プールのサイズを指定または調整する動的なパラメータです。Oracle Databaseによって、適切なデフォルト値が選択されます。
Oracle Database 10g リリース1より前のリリースでは、割り当てられる共有プール・メモリーの量は、SHARED_POOL_SIZE初期化パラメータの値に、インスタンスの起動時に計算された内部SGAオーバーヘッドの量を加算した値と等しい値でした。内部SGAオーバーヘッドとは、他の複数の初期化パラメータの値に基づいて起動時にOracle Databaseによって割り当てられるメモリーです。このメモリーは、SGAの様々なサーバー・コンポーネントの状態を維持するために使用されます。たとえば、SHARED_POOL_SIZEパラメータが64MBに設定されていて、計算された内部SGAオーバーヘッドの値が12MBである場合、共有プールの実際のサイズは64+12=76MBですが、SHARED_POOL_SIZEパラメータの値は64MBと表示されます。
Oracle Database 10g リリース1以降では、内部SGAオーバーヘッドのサイズは、ユーザー指定のSHARED_POOL_SIZEの値に含まれます。つまり、自動メモリー管理または自動共有メモリー管理を使用していない場合、起動時に割り当てられる共有プール・メモリーの量はSHARED_POOL_SIZE初期化パラメータの値と等しくなり、グラニュル・サイズの倍数に丸められます。したがって、このパラメータには、必要な共有プール・サイズに内部SGAオーバーヘッドを加えた値を設定する必要があります。前述の例の場合、SHARED_POOL_SIZEパラメータが起動時に64MBに設定されているとすると、内部SGAオーバーヘッドの値が変わっていなければ、起動後に使用可能な共有プールの値は、64-12=52MBになります。起動後に共有プール・メモリーとして有効な値を64MB維持するには、SHARED_POOL_SIZEパラメータを64+12=76MBに設定する必要があります。
Oracle Database 10g リリース1より前のリリースから移行する場合、Oracle Database 11gの移行ユーティリティでは、アップグレード前の環境の内部SGAオーバーヘッドの値とこのパラメータの古い値に基づいて、このパラメータの新しい値が推奨されます。Oracle Database 10gからは、内部SGAオーバーヘッド(共有プールの起動オーバーヘッドとも呼ばれます)の正確な値は、V$SGAINFOビューから問合せできます。また、手動共有メモリー管理モードでは、ユーザー指定のSHARED_POOL_SIZEの値が小さすぎるために、内部SGAオーバーヘッドの必要量にも満たない場合は、起動時にORA-371エラーが生成され、SHARED_POOL_SIZEパラメータに使用する推奨値が示されます。
Oracle Database 11gで自動共有メモリー管理を使用する場合、共有プールは自動的にチューニングされ、ORA-371エラーは生成されません。
結果キャッシュのメモリーは共有プールから取得されます。したがって、結果キャッシュの最大サイズを大きくする場合は、共有プールのサイズ設定時にこのサイズを考慮する必要があります。
LARGE_POOL_SIZE初期化パラメータは、SGAのコンポーネントであるラージ・プールのサイズを指定または調整する動的なパラメータです。ラージ・プールは、SGAのオプションのコンポーネントです。ラージ・プールを作成する場合は、LARGE_POOL_SIZEパラメータを設定する必要があります。 ラージ・プールの構成方法は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。
JAVA_POOL_SIZE初期化パラメータは、SGAのコンポーネントであるJavaプールのサイズを指定または調整する動的なパラメータです。Oracle Databaseによって、適切なデフォルト値が選択されます。 Javaプールの構成方法は、『Oracle Database Java 開発者ガイド』を参照してください。
STREAMS_POOL_SIZE初期化パラメータは、SGAのコンポーネントであるStreamsプールのサイズを指定または調整する動的なパラメータです。STREAMS_POOL_SIZEが0(ゼロ)に設定されている場合、Oracle Streams製品では、メモリーが必要時にバッファ・キャッシュからStreamsプールに転送されます。 詳細は、『Oracle Streams概要および管理』のStreamsプールの説明を参照してください。
RESULT_CACHE_MAX_SIZE初期化パラメータは、SGAのコンポーネントである結果キャッシュの最大サイズを指定する動的なパラメータです。通常このパラメータを指定する必要はありません。これは、データベースによって、SGAに使用可能な合計メモリーと現在使用中のメモリー管理方法に基づいてデフォルトの最大サイズが選択されるためです。現在のデフォルトの最大サイズを参照するには、RESULT_CACHE_MAX_SIZEパラメータの値を表示します。この最大サイズを変更するには、ALTER SYSTEM文を使用してRESULT_CACHE_MAX_SIZEを設定するか、またはテキスト形式の初期化パラメータ・ファイルでこのパラメータを指定します。いずれの場合も、値は最も近い32Kの倍数に切り上げられます。
インスタンスの起動時にRESULT_CACHE_MAX_SIZEが0(ゼロ)の場合、結果キャッシュは使用禁止です。使用可能にするには、RESULT_CACHE_MAX_SIZEを0(ゼロ)以外の値に設定して(またはテキスト形式の初期化パラメータ・ファイルからこのパラメータを削除してデフォルトの最大サイズを取得して)、データベースを再起動する必要があります。
結果キャッシュが使用禁止の状態でデータベースを起動した後、ALTER SYSTEM文を使用してRESULT_CACHE_MAX_SIZEを0(ゼロ)以外の値に設定し、その後データベースを再起動していない場合、RESULT_CACHE_MAX_SIZEパラメータの値を問い合せると、結果キャッシュが使用禁止状態のままでも0(ゼロ)以外の値が返されます。したがって、RESULT_CACHE_MAX_SIZEの値は、結果キャッシュが使用可能かどうかを判断する最も信頼できる方法ではありません。かわりに、次の問合せを使用できます。
SELECT dbms_result_cache.status() FROM dual; DBMS_RESULT_CACHE.STATUS() --------------------------------------------- ENABLED
結果キャッシュのメモリーは共有プールから取得されるため、結果キャッシュの最大サイズを大きくする場合は、共有プールのサイズを大きくすることも考慮する必要があります。
ビューV$RESULT_CACHE_STATISTICSおよびPL/SQLパッケージのプロシージャDBMS_RESULT_CACHE.MEMORY_REPORTでは、結果キャッシュに現在割り当てられているメモリー量の判断に役立つ情報が表示されます。
PL/SQLパッケージのファンクションDBMS_RESULT_CACHE.FLUSHでは、結果キャッシュがクリアされ、すべてのメモリーが共有プールに解放されます。
いくつかの追加の初期化パラメータを設定して、SGAのメモリー使用方法を制御できます。
LOCK_SGAパラメータをTRUEに設定すると、SGA全体が物理メモリーにロックされます。このパラメータは、自動メモリー管理または自動共有メモリー管理と組み合せて使用することはできません。
SHARED_MEMORY_ADDRESSおよびHI_SHARED_MEMORY_ADDRESSパラメータでは、実行時のSGAの開始アドレスが指定されます。これらのパラメータはほとんど使用されません。64ビットのプラットフォームの場合、HI_SHARED_MEMORY_ADDRESSでは、64ビット・アドレスの上位32ビットが指定されます。
USE_INDIRECT_DATA_BUFFERSパラメータは、4GBを超える物理メモリーをサポートする32ビット・プラットフォームで、拡張バッファ・キャッシュ・メカニズムを使用可能にします。この大容量の物理メモリーをサポートしていないプラットフォームでは、このパラメータは無視されます。このパラメータは、自動メモリー管理または自動共有メモリー管理と組み合せて使用することはできません。
デフォルトで、Oracle Databaseでは、インスタンスPGA専用のメモリーの合計量が自動的かつグローバルに管理されます。この量は、初期化パラメータPGA_AGGREGATE_TARGETを設定することによって制御できます。Oracle Databaseでは、すべてのデータベース・サーバー・プロセスとバックグラウンド・プロセスに割り当てられるPGAメモリーの合計量がこのターゲット値を超えないようにします。
DBCAを使用してデータベースを作成する場合は、合計インスタンスPGAの値を指定できます。その後、DBCAによって、作成されるサーバー・パラメータ・ファイル(SPFILE)に、PGA_AGGREGATE_TARGET初期化パラメータが設定されます。合計インスタンスPGAを指定しない場合は、DBCAによって適切なデフォルト値が選択されます。
CREATE DATABASE SQL文とテキスト形式のパラメータ・ファイルを使用してデータベースを作成する場合は、PGA_AGGREGATE_TARGETの値を指定できます。このパラメータを省略すると、データベースによってデフォルト値が選択されます。
自動PGAメモリー管理を使用すると、すべての専用サーバー・セッションに対するSQL作業領域のサイズが自動で設定され、これらのセッションについてはすべての*_AREA_SIZE初期化パラメータが無視されます。特定の時期に、インスタンス上のアクティブな作業領域で使用可能なPGAメモリーの合計量がパラメータPGA_AGGREGATE_TARGETから自動的に導出されます。この量は、PGA_AGGREGATE_TARGETの値から、他の目的で割り当てられたPGAメモリー(例: セッション・メモリー)を減算した値に設定されます。結果のPGAメモリーは、その特定のメモリー要件に基づいて個々のアクティブな作業領域に割り当てられます。
PGAメモリーの使用統計を提供する動的なパフォーマンス・ビューが用意されています。これらの統計のほとんどは、PGA_AGGREGATE_TARGETが設定されると使用可能になります。
V$SYSSTAT
V$SESSTAT
V$PGASTAT
V$SQL_WORKAREA
V$SQL_WORKAREA_ACTIVE
V$PROCESSビューの次の3つの列では、Oracle Databaseプロセスによって割り当てられ使用されているPGAメモリーがレポートされます。
PGA_USED_MEM
PGA_ALLOCATED_MEM
PGA_MAX_MEM
Oracle Databaseでは、SQL作業領域を手動でチューニングする手動PGAメモリー管理がサポートされています。
Oracle Database 10gより前のリリースでは、データベース管理者がパラメータSORT_AREA_SIZE、HASH_AREA_SIZE、BITMAP_MERGE_AREA_SIZEおよびCREATE_BITMAP_AREA_SIZEを設定することで、SQL作業領域の最大サイズを制御していました。しかし、最大作業領域サイズは、データ入力サイズとシステム内でアクティブな作業領域の合計数から選択するのが理想であるため、これらのパラメータの設定は困難です。これら2つの要因は、作業領域および時間により大幅に変動します。このため、各種*_AREA_SIZEパラメータを最適な状況でチューニングすることは困難です。
このような理由から、自動PGAメモリー管理を使用可能にしておくことをお薦めします。
SQL作業領域を手動でチューニングする場合は、WORKAREA_SIZE_POLICY初期化パラメータをMANUALに設定する必要があります。
ここでは、メモリー管理に関する次の参考情報を提供します。
次のプラットフォームでは自動メモリー管理がサポートされます。自動メモリー管理は、SGAおよびPGAのサイズを自動的にチューニングするOracle Databaseの機能で、パフォーマンスを最適化するために、要求に応じてメモリーが領域間で再配分されます。
次の動的パフォーマンス・ビューには、メモリー管理に関する情報が表示されます。