9 データベース・メモリーの割当て

この章では、Oracle Databaseにおけるメモリー割当て、およびメモリー管理の様々な方法について説明します。

この章のトピックは、次のとおりです:

データベース・メモリー・キャッシュと他のメモリー構造について

Oracle Databaseでは、メモリー・キャッシュおよびディスクに情報を格納します。メモリー・アクセスは、ディスク・アクセスよりはるかに高速です。ディスク・アクセス(物理I/O)は、メモリー・アクセスに比べ、時間がかかります(通常は約10ミリ秒)。また、物理I/Oでは、デバイス・ドライバやオペレーティング・システムのイベント・スケジューラのパス長のために必要なCPUリソースも増加します。このため、頻繁にアクセスされるオブジェクトに対するデータ・リクエストは、ディスク・アクセスではなくメモリー・アクセスで実行するほうが効率的です。Oracle Databaseメモリー・キャッシュを適切にサイズ設定して効率的に使用すると、データベースのパフォーマンスが大幅に向上します。

パフォーマンスに影響するOracle Databaseの主なメモリー・キャッシュは、次のとおりです。

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

    データベース・バッファ・キャッシュには、ディスクから読み取られたデータ・ブロックが格納されます。

  • REDOログ・バッファ

    REDOログ・バッファには、バッファ・キャッシュのデータ・ブロックに行われた変更のREDOエントリが格納されます。

  • 共有プール

    共有プールからは様々なタイプのデータがキャッシュされ、主に次のコンポーネントで構成されています。

    • ライブラリ・キャッシュ

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

    • サーバー結果キャッシュ

  • ラージ・プール

    ラージ・プールでは、次のようなOracle Database機能に対して大量のメモリー割当てを行うことができます。

    • 共有サーバー・アーキテクチャ

    • パラレル問合せ

    • Recovery Manager (RMAN)

  • Javaプール

    Javaプールには、セッションに特化したJavaコードおよびJava Virtual Machine (JVM)データが格納されます。

  • Streamsプール

    Streamsプールは、Oracle Advanced Queuing (AQ)およびレプリケーション・プロセスのためのメモリーを提供します。

  • プロセス・プライベート・メモリー

    プロセス・プライベート・メモリーには、ソートやハッシュ結合などの操作に使用されるメモリーが含まれます。

  • インメモリー列ストア(IM列ストア)

    IM列ストアは、表およびパーティションのコピーを格納するオプションの静的SGAプールです。IM列ストアでは、データは特殊な列形式に格納され、これによってスキャン、結合および集計などの操作のパフォーマンスが向上します。

    ノート:

    IM列ストアでは、バッファ・キャッシュは置換しませんが、両方のメモリー領域において同じデータを異なる形式で格納するための補足としての役割を果たします。

関連項目:

Oracle Databaseのメモリー・アーキテクチャの詳細は、『Oracle Database概要』を参照してください

データベース・メモリーの管理方法

メモリー管理の目標は、必要なデータがメモリー内にある可能性を高くしたり、必要なデータを取り出すプロセスをさらに効率的にし、できるだけ多くの物理I/Oオーバーヘッドを削減することです。この目標を達成するためには、Oracle Databaseメモリー・キャッシュを適切にサイズ設定して効率的に使用することが不可欠です。

図9-1に、メモリー管理オプションのデシジョン・ツリーを示します。次の各項では、各オプションの詳細を説明します。

図9-1 メモリー管理方法

図9-1の説明が続きます。
「図9-1 メモリー管理方法」の説明

自動メモリー管理

自動メモリー管理では、Oracle Databaseにより、共有グローバル領域(SGA)およびプログラム・グローバル領域(インスタンスPGA)のメモリーが完全に管理されます。最もシンプルなこの方法を使用することをお薦めします。

メモリー・プール・サイズを手動で設定する前に、自動メモリー管理を使用することを積極的に検討してください。

ユーザー指定の制御は、ターゲット・メモリー・サイズ初期化パラメータ(MEMORY_TARGET)と、オプションの最大メモリー・サイズ初期化パラメータ(MEMORY_MAX_TARGET)のみです。Oracle Databaseは、ターゲット・メモリー・サイズに自動的にチューニングし、必要に応じて、SGAとインスタンスPGA間でメモリーを再配布します。

SGAには、インメモリー列ストア(IM列ストア)またはmemoptimizeプールを含めることができます(いずれもオプションです)。使用するメモリー管理方法にかかわらず、IM列ストアのサイズ設定にはINMEMORY_SIZE初期化パラメータを使用し、memoptimizeプールのサイズ設定にはMEMOPTIMIZE_POOL_SIZE初期化パラメータを使用します。IM列ストアのサイズとmemoptimizeプールはメモリー・ターゲットに含まれますが、自動サイズ変更アルゴリズムによる管理対象ではありません。たとえば、MEMORY_TARGETを5GBに設定し、INMEMORY_SIZEを1GBに設定した場合、メモリー・ターゲット全体は5GBで(6GBではない)INMEMORY_SIZEは常に1GBです。

次の図に、オンライン・ユーザーにより発行されたジョブを必要に応じて処理したり、バッチ・ジョブを処理するデータベースを示します。自動メモリー管理を使用すると、データベースは実行するジョブのタイプに応じて、自動的にラージ・プールデータベース・バッファ・キャッシュのサイズを調整します。以下の図にはIM列ストアおよびメモリー最適化領域は示されていない点に注意してください。

図9-2 自動メモリー管理

図9-2の説明が続きます
「図9-2 自動メモリー管理」の説明

DBCAを使用してデータベースを作成し、基本インストール・オプションを選択した場合、Oracle Databaseではデフォルトで自動メモリー管理が有効化されます。

関連項目:

自動共有メモリー管理

Oracle Databaseでは、自動メモリー管理が無効になっている場合はSGAメモリーの自動共有メモリー管理が使用されます。

このモードでは、Oracle Databaseにより、合計SGAメモリーに設定されているターゲット・サイズに基づき、メモリーが自動的に個々のSGAコンポーネントに配分されます。

データベースは、SGAの合計サイズをターゲット・サイズにチューニングし、動的にSGAコンポーネントのサイズをチューニングします。サーバー・パラメータ・ファイルを使用している場合、Oracle Databaseでは、自動チューニングされたコンポーネントのサイズがデータベース・インスタンス停止後も保持されます。

自動共有メモリー管理の使用方法の詳細は、「自動共有メモリー管理の使用」を参照してください。

手動共有メモリー管理

自動メモリー管理および自動共有メモリー管理の両方が無効化されている場合は、SGAの個々のメモリー・プールのサイズを設定して、手動でSGAメモリーを管理する必要があります。このモードでは、SGAメモリーの分散方法をユーザーが完全に制御できますが、SGAコンポーネントを継続的に手動でチューニングする必要があるため、最も手間がかかります。

ノート:

自動メモリー管理が無効になっている場合、データベースはユーザー・ワークロードに応じて共有プールとバッファ・キャッシュの相対サイズを自動的に調整することがあります。

手動共有メモリー管理の詳細は、「手動によるSGAコンポーネントのサイズ設定」を参照してください。

自動PGAメモリー管理

自動メモリー管理(MEMORY_TARGET)が無効になっており、PGA_AGGREGATE_TARGETが0(ゼロ)以外の値に設定されている場合、データベースでは自動PGAメモリー管理が使用されます。このモードでは、PGA_AGGREGATE_TARGETによってインスタンスPGAの柔軟なターゲット・サイズが指定されます。ターゲットが柔軟であるのは、PGAではなく一時領域を使用するように選択できる特定タイプのメモリー割当てにのみ適用されるためです。データベースは、このターゲットに対してインスタンスPGAのサイズをチューニングし、個々のPGAのサイズを動的にチューニングします。ターゲット・サイズを明示的に設定しない場合は、適切なデフォルト値がデータベースによって自動的に構成されます。

PGA_AGGREGATE_LIMIT初期化パラメータは、PGAメモリーに対してインスタンス全体の厳しい制限を動的に設定します。パラメータは変化するメモリーの状態に対応するため、明示的にパラメータ値を設定する必要はありません。デフォルトでは、PGA_AGGREGATE_LIMITは次の値より大きい値に設定されます。

  • 2 GB

  • PGA_AGGREGATE_TARGET初期化パラメータ設定の200%

  • (PROCESSES初期化パラメータ設定の値) * 3MB

バックグラウンド・プロセスでは、PGAサイズとPGA_AGGREGATE_LIMITで設定された制限とを定期的に比較します。制限に達した場合または制限を超過した場合、このプロセスでは、最もチューニング不可なPGAメモリーを使用してセッションのコールを終了します。これらのセッションによっても十分なメモリーが解放されない場合、それらも終了されます。

自動PGAメモリー管理の詳細は、「プログラム・グローバル領域のチューニング」を参照してください。

手動PGAメモリー管理

自動メモリー管理が無効になっており、PGA_AGGREGATE_TARGET0に設定されている(自動PGAメモリー管理が無効になっている)場合、データベースでは、手動PGA管理がデフォルトになります。PGAメモリーのうち各作業領域専用にする割合を調整することで、PGAメモリーを手動で管理する必要があります。

ワークロードは常に変化するため、この方法は非常に困難になる可能性があり、薦めしません。Oracle Databaseでは、手動によるPGAメモリー管理がサポートされていますが、自動メモリー管理または自動PGAメモリー管理を使用することをお薦めします。

メモリー管理方法の概要

メモリー管理は、自動または手動のいずれかで実行します。

自動メモリー管理を有効化しない場合は、SGAおよびPGAのそれぞれに対して個別にメモリー管理方法を構成する必要があります。

ノート:

自動メモリー管理がデータベース・インスタンス全体に対して無効の場合、Oracle Databaseではデフォルトで、自動PGAメモリー管理が有効になります。

次の表には、INMEMORY_SIZE初期化パラメータとMEMOPTIMIZE_POOL_SIZE初期化パラメータが含まれています。どちらも、オプションのメモリー領域を制御します。

表9-1 メモリー管理方法

インスタンス SGA PGA 説明 初期化パラメータ

自動

該当なし

該当なし

1つのインスタンス・ターゲット・サイズに基づいてインスタンスのサイズがチューニングされます。

設定項目:

  • データベース・インスタンスの合計メモリー・ターゲット・サイズ(MEMORY_TARGET)

  • (オプション)データベース・インスタンスの最大メモリー・サイズ(MEMORY_MAX_TARGET)

  • SGA内のIM列ストアのオプションのサイズ(INMEMORY_SIZE)

該当なし

自動

自動

SGAはSGAターゲットに基づいて自動的にチューニングされます。

PGAはPGAターゲットに基づいて自動的にチューニングされます。

設定項目:

  • SGAのターゲット・サイズ(SGA_TARGET)

  • (オプション)SGAの最大サイズ(SGA_MAX_SIZE)

  • SGA内のIM列ストアのオプションのサイズ(INMEMORY_SIZE)

  • オプションでSGAのmemoptimizeプールのサイズ(MEMOPTIMIZE_POOL_SIZE)

  • PGA集計ターゲット・サイズ(PGA_AGGREGATE_TARGET)脚注1

データベースによってPGA_AGGREGATE_LIMIT初期化パラメータが自動的に構成されます。このパラメータは手動で設定できます。

該当なし

自動

手動

SGAはSGAターゲットに基づいて自動的にチューニングされます。

PGAは、SQLのunresolvable-reference.htmlのタイプごとに最大作業領域サイズを設定して、手動で制御します。

設定項目:

  • SGAのターゲット・サイズ(SGA_TARGET)

  • (オプション)SGAの最大サイズ(SGA_MAX_SIZE)

  • SGA内のIM列ストアのオプションのサイズ(INMEMORY_SIZE)

  • オプションでSGAのmemoptimizeプールのサイズ(MEMOPTIMIZE_POOL_SIZE)

  • SORT_AREA_SIZEHASH_AREA_SIZEBITMAP_MERGE_AREA_SIZEなどのPGA作業領域パラメータ

該当なし

手動

自動

SGAは個々のコンポーネント・サイズを設定し、手動で制御します。

PGAはPGAターゲットに基づいて自動的にチューニングされます。

設定項目:

  • 共有プール・サイズ(SHARED_POOL_SIZE)

  • バッファ・キャッシュ・サイズ(DB_CACHE_SIZE)

  • ラージ・プール・サイズ(LARGE_POOL_SIZE)

  • Javaプール・サイズ(JAVA_POOL_SIZE)

  • SGA内のIM列ストアのオプションのサイズ(INMEMORY_SIZE)

  • オプションでSGAのmemoptimizeプールのサイズ(MEMOPTIMIZE_POOL_SIZE)

  • PGA集計ターゲット・サイズ(PGA_AGGREGATE_TARGET)脚注2

データベースによってPGA_AGGREGATE_LIMIT初期化パラメータが自動的に構成されます。このパラメータは手動で設定できます。

該当なし

手動

手動

SGAコンポーネントサイズを手動で構成する必要があります。

PGAは各タイプのSQL演算子の作業領域の最大サイズを指定し、手動で制御します。

SGAコンポーネントサイズを手動で構成する必要があります。設定項目:

  • 共有プール・サイズ(SHARED_POOL_SIZE)

  • バッファ・キャッシュ・サイズ(DB_CACHE_SIZE)

  • ラージ・プール・サイズ(LARGE_POOL_SIZE)

  • Javaプール・サイズ(JAVA_POOL_SIZE)

  • SGA内のIM列ストアのオプションのサイズ(INMEMORY_SIZE)

  • オプションでSGAのmemoptimizeプールのサイズ(MEMOPTIMIZE_POOL_SIZE)

  • SORT_AREA_SIZEHASH_AREA_SIZEBITMAP_MERGE_AREA_SIZEなどのPGA作業領域パラメータ

脚注1

データベースによってPGA_AGGREGATE_LIMIT初期化パラメータが自動的に構成されます。このパラメータを手動で設定するように選択することもできます。

脚注2

データベースによってPGA_AGGREGATE_LIMIT初期化パラメータが自動的に構成されます。このパラメータを手動で設定するように選択することもできます。

関連項目:

自動メモリー管理が使用できないプラットフォームもあります。『Oracle Database管理者ガイド』を参照してください。

自動メモリー管理の使用

自動メモリー管理を使用するには、次の初期化パラメータを設定します。

  • MEMORY_TARGET

    MEMORY_TARGET初期化パラメータには、ターゲット・メモリー・サイズを指定します。データベースは、SGAおよびインスタンスPGAの間で必要に応じてメモリーを再配分し、このパラメータに指定された値になるよう調整します。このパラメータは動的であるため、データベースを再起動することなく、いつでもこの値を変更できます。

  • MEMORY_MAX_TARGET

    MEMORY_MAX_TARGET初期化パラメータには、最大メモリー・サイズを指定します。このパラメータに指定された値は、MEMORY_TARGET初期化パラメータに設定できる制限値の役割をはたします。このパラメータは静的であるため、インスタンスの起動後にこの値を変更することはできません。

MEMORY_TARGETパラメータのチューニングにアドバイスが必要な場合は、V$MEMORY_TARGET_ADVICEビューを使用してください。

関連項目:

自動メモリー管理の使用方法の詳細は、『Oracle Database管理者ガイド』を参照してください。

メモリー管理の監視

表9-2に、メモリー・サイズ変更操作に関する情報が表示されるビューを示します。

表9-2 メモリー管理ビュー

ビュー 説明

V$MEMORY_CURRENT_RESIZE_OPS

現在進行中のメモリー・サイズ変更操作(自動および手動の両方)に関する情報が表示されます。

V$MEMORY_DYNAMIC_COMPONENTS

動的にチューニングされたすべてのメモリー・コンポーネントの現在のサイズ(SGAおよびインスタンスPGAの合計サイズなど)に関する情報が表示されます。

V$MEMORY_RESIZE_OPS

最新800件の実行済メモリー・サイズ変更操作(自動および手動の両方)に関する情報が表示されます。これには現在進行中の操作は含まれません。

V$MEMORY_TARGET_ADVICE

MEMORY_TARGET初期化パラメータのチューニング・アドバイスが表示されます。

関連項目:

これらのビューの詳細は、『Oracle Databaseリファレンス』を参照してください。