日本語PDF

12 システム・グローバル領域のチューニング

この章では、システム・グローバル領域(SGA)のチューニング方法を説明します。自動メモリー管理を使用してシステムのデータベース・メモリーを管理している場合は、この章で説明されているように、SGAのチューニングは必要ありません。

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

自動共有メモリー管理の使用

自動共有メモリー管理を使用すると、SGAのメモリーが次のメモリー・プールに自動的に配分され、SGAの構成が簡略化されます。

  • データベース・バッファ・キャッシュ(デフォルト・プール)

  • 共有プール

  • ラージ・プール

  • Javaプール

  • Streamsプール

自動共有メモリー管理は、SGA_TARGETパラメータで制御します。SGA_TARGETパラメータの値を変更すると、これらのメモリー・プールが自動的にサイズ変更されます。これらのメモリー・プールがゼロ以外の値に設定されている場合、自動共有メモリー管理では、これらの値が最低レベルとして使用されます。最低値は、アプリケーション・コンポーネントが正しく機能するために必要な最低メモリー量に基づいて設定することをお薦めします。

次に示すメモリー・キャッシュは手動でサイズ設定されるコンポーネントで、自動共有メモリー管理の制御対象ではありません。

  • REDOログ・バッファ

    REDOログ・バッファは、「REDOログ・バッファの構成」で説明されているように、LOG_BUFFER初期化パラメータを使用してサイズ設定されます。

  • その他のバッファ・キャッシュ(KEEPRECYCLEおよび他の非デフォルト・ブロック・サイズなど)

    KEEPプールは、「KEEPプールの構成」で説明されているように、DB_KEEP_CACHE_SIZE初期化パラメータを使用してサイズ設定されます。

    RECYCLEプールは、「RECYCLEプールの構成」で説明されているように、DB_RECYCLE_CACHE_SIZE初期化パラメータを使用してサイズ設定されます。

  • 固定SGAおよびその他の内部割当て

    固定SGAおよびその他の内部割当ては、DB_nK_CACHE_SIZE初期化パラメータを使用してサイズ設定されます。

これらのメモリー・キャッシュに割り当てられたメモリーは、自動チューニングされたメモリー・プールの値が自動共有メモリー管理によって計算されるときに、SGA_TARGETパラメータの値から引かれます。

次の各項では、SGA_TARGETパラメータの値へのアクセス方法および設定方法を説明します。

関連項目:

  • SGAの詳細は、『Oracle Database概要』を参照してください

  • SGAの管理の詳細は、『Oracle Database管理者ガイド』を参照してください

  • 初期化パラメータの使用方法の詳細は、『Oracle Database管理者ガイド』を参照してください

SGA_TARGETパラメータを設定するためのユーザー・インタフェース

この項では、SGA_TARGETパラメータの値を設定するためのユーザー・インタフェースについて説明します。

この項では、次の項目について説明します。

Oracle Enterprise Manager Cloud ControlでのSGA_TARGETパラメータの設定

メモリー・パラメータSGAページからSGAサイズ・アドバイザにアクセスすることにより、Oracle Enterprise Manager Cloud Control (Cloud Control)でSGA_TARGETパラメータの値を変更できます。

コマンドライン・インタフェースでのSGA_TARGETパラメータの設定

V$SGA_TARGET_ADVICEビューを問い合せ、ALTER SYSTEMコマンドを使用することにより、コマンドライン・インタフェースでSGA_TARGETパラメータの値を変更できます。

SGA_TARGETパラメータの設定

この項では、SGA_TARGETパラメータの値を設定して、自動共有メモリー管理を有効化および無効化する方法を説明します。

この項では、次の項目について説明します。

自動共有メモリー管理の有効化

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

  • STATISTICS_LEVELTYPICALまたはALL

  • SGA_TARGETをゼロ以外の値に

    SGA_TARGETパラメータは、SGA_MAX_SIZE初期化パラメータの値以下に設定できます。SGA_TARGETパラメータの値は、SGA専用にするメモリーの容量に設定します。

自動共有メモリー管理の無効化

自動共有メモリー管理を無効化するには、インスタンスの起動時にSGA_TARGETパラメータの値を動的に0に設定します。

これにより、自動共有メモリー管理が無効化され、現在の自動チューニングされたサイズが各メモリー・プールに使用されます。必要な場合は、「手動によるSGAコンポーネントのサイズ設定」の説明に従い、各メモリー・プールのサイズを手動で再設定できます。

統合プログラム・グローバル領域

統合プログラム・グローバル領域(PGA)プールは、マルチテナント・コンテナ・データベース(CDB)と比較してCPUごとのSGAターゲット値が小さくなっている特定のプラガブル・データベース(PDB)によってPGA作業領域に使用される共有グローバル領域(SGA)コンポーネントです。

PGAを使用すると、Autonomous Transaction Processing (ATP)プラガブル・データベース(PDB)をAutonomous Data Warehouse (ADW) PDBに置き換えることができます。そのためには、SGAからADW PDBに一部のPGAを透過的に割り当てます。

ATP-D環境では、メモリーはSGAとPGAの使用量で分割されます。SGAは、仮想マシンまたはホストの起動時またはメモリーが断片化される前の初期段階で一般的に予約されているラージ・ページによってサポートされます。システム・メモリーのSGA部分は、トランザクション・プロセスの要件に基づいて構成され、通常、SGAの場合は65%、PGAの場合は35%です。ただし、ADWプラガブル・データベースにはより多くのプライベート・メモリーが必要であり、通常、SGAの場合は35%、PGAの場合は65%の範囲となります。残念なことに、システムがATP用に構成されているため、PGAのニーズに対してヒュージ・ページ(SGA用に構成)のメモリーを解放できません。ラージ・ページは断片化されると、将来再利用することは困難です。

統合PGAプールは、共有グローバル領域(SGA)がプラガブル・データベース(PDB)のプログラム・グローバル領域(PGA)に使用できるようになる新しい構成です。統合PGAでは、拡張する必要がある場合はバッファ・キャッシュから完全なグラニュルのみをリクエストし、不要になった場合は完全なグラニュルを放棄します。インスタンスの起動時に、PGAには、最小サイズ0 (ゼロ)または_SIZEパラメータで定義されたサイズを指定できます。

ノート:

完全なグラニュルのみが統合PGAプールで使用できるため、グラニュルが拡張のためにリクエストされる頻度およびシステム・リストに戻されるまでの時間について注意してください。

手動によるSGAコンポーネントのサイズ設定

システムで自動メモリー管理または自動共有メモリー管理が使用されていない場合は、次のSGAコンポーネントのサイズを手動で構成する必要があります。

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

    データベース・バッファ・キャッシュは、「データベース・バッファ・キャッシュの構成」で説明されているように、DB_CACHE_SIZE初期化パラメータを使用してサイズ設定されます。

  • 共有プール

    共有プールは、「共有プールの構成」で説明されているように、SHARED_POOL_SIZE初期化パラメータを使用してサイズ設定されます。

  • ラージ・プール

    ラージ・プールは、「ラージ・プールの構成」で説明されているように、LARGE_POOL_SIZE初期化パラメータを使用してサイズ設定されます。

  • Javaプール

    Javaプールは、JAVA_POOL_SIZE初期化パラメータを使用してサイズ設定されます。

  • Streamsプール

    Streamsプールは、STREAMS_POOL_SIZE初期化パラメータを使用してサイズ設定されます。

  • IM列ストア

    IM列ストアは、INMEMORY_SIZE初期化パラメータを使用してサイズ設定されます。

これらのパラメータの値は、ALTER SYSTEM文を使用して動的に構成することも可能です。

これらのSGAコンポーネントのサイズを構成する前に、次の内容を考慮してください。

関連項目:

  • Javaのメモリー使用量およびJAVA_POOL_SIZE初期化パラメータの詳細は、『Oracle Database Java開発者ガイド』を参照してください

  • INMEMORY_SIZE初期化パラメータの詳細は、Oracle Database In-Memoryガイドを参照してください

SGAのサイズ設定単位

バッファ・キャッシュ、共有プール、ラージ・プールおよびJavaプールのメモリーは、グラニュル単位で割り当てられます。SGAのサイズが1GBより少ない場合、グラニュル・サイズは4MBです。SGAサイズが1GBを超えている場合、グラニュル・サイズは16MBに変化します。グラニュル・サイズは、データベース・インスタンスの起動時に計算されて固定されます。このサイズは、インスタンスの存続期間中は変化しません。

SGAで現在使用されているグラニュル・サイズを表示するには、V$SGA_DYNAMIC_COMPONENTSビューを使用します。それと同じグラニュルのサイズがSGAのすべての動的コンポーネントで使用されます。

SGAの最大サイズ

データベース・インスタンスで使用できる最大メモリー量は、インスタンス起動時にSGA_MAX_SIZE初期化パラメータで決定されます。SGAの総サイズは、SGA_MAX_SIZEパラメータの値まで拡張できます。SGA_MAX_SIZEパラメータの値は、すべてのSGAコンポーネントの集計にデフォルト設定されています。

SGA_MAX_SIZEパラメータの値が設定されていない場合は、必要であれば、1つのキャッシュのサイズを減らして、そのメモリーを別のキャッシュに再割当てします。または、SGA_MAX_SIZEパラメータの値を、バッファ・キャッシュや共有プールなど、すべてのSGAコンポーネントの合計より大きく設定することも可能です。こうすることにより、別のキャッシュ・サイズを減らさずに、キャッシュ・サイズを動的に増加できます。

ノート:

SGA_MAX_SIZEパラメータの値は、動的にサイズ変更できません。

アプリケーションの考慮事項

メモリーを構成する場合は、アプリケーションの必要性に基づいて、メモリー・キャッシュを適切にサイズ設定してください。逆に、アプリケーションのメモリー・キャッシュの使用率をチューニングすると、リソース要件を大幅に削減できます。メモリー・キャッシュを効率的に使用すると、ラッチ、CPU、I/Oシステムなどの関連リソースに対する負荷も軽減できます。

最適なパフォーマンスを得るために、次のことを考慮してください。

  • オペレーティング・システムおよびデータベース・リソースを、最も効率的に使用するようキャッシュを設計してください。

  • アプリケーションの必要性を最もよく反映するように、Oracle Databaseメモリー構造にメモリーを割り当ててください。

  • 既存のアプリケーションに変更または追加を行う場合は、変更されたアプリケーションの必要性に対応するようOracle Databaseのメモリー構造のサイズを変更してください。

  • アプリケーションがJavaを使用する場合、Javaプールのデフォルト構成を変更する必要があるかどうかを調べてください。

関連項目:

Javaのメモリー使用量の詳細は、『Oracle Database Java開発者ガイド』を参照してください。

オペレーティング・システムのメモリー使用量

大半のオペレーティング・システムでは、メモリーを構成する際に次のことを考慮することが重要です。

関連項目:

オペレーティング・システムのメモリー使用方法のチューニングの詳細は、オペレーティング・システムのハードウェアとソフトウェアのマニュアル、およびオペレーティング・システム固有のOracleマニュアルを参照してください。

ページングの削減

ページングは、新しいページをメモリーにロードするため、オペレーティング・システムがメモリー常駐ページをディスクに転送する場合に行われます。多くのオペレーティング・システムは、実メモリーに格納しきれない大量の情報を収容するために、ページングを行います。大半のオペレーティング・システムでは、ページングはパフォーマンスを低下させます。

ホスト・システムで大量のページングが発生しているかどうかを判断するには、オペレーティング・システムのユーティリティを使用して、オペレーティング・システムを調べます。大量のページングが発生している場合は、メモリーが割り当てられているメモリー・キャッシュを保持できるほど、合計システム・メモリーが大きくない可能性があります。システムの総メモリー量を増加するか、割り当てられているメモリー量を低減することを検討してください。

メイン・メモリーへのSGAの格納

SGAの目的は、迅速なアクセスのためにメモリー内にデータを格納することであるため、SGAはメイン・メモリー内に存在する必要があります。SGAのページがディスクにスワップされると、データに迅速にアクセスできなくなります。多くのオペレーティング・システムでは、ページングによる損失は、大規模なSGAがもたらす利益をかなり上回ります。

この項では、次の項目について説明します。

SGAメモリー割当ての表示

SGAとその各内部構造に割り当てられているメモリー量を確認するには、次の例に示すように、SQL*PlusでSHOW SGA文を使用します。

SQL> SHOW SGA

この文の出力を次に示します。

Total System Global Area  840205000 bytes
Fixed Size                   279240 bytes
Variable Size             520093696 bytes
Database Buffers          318767104 bytes
Redo Buffers                1064960 bytes
物理メモリーへのSGAのロック

SGAのページ・アウトを回避するには、LOCK_SGAパラメータを有効化して、SGAを物理メモリーにロックすることを検討してください。LOCK_SGAパラメータを有効化した場合、MEMORY_TARGETおよびMEMORY_MAX_TARGETパラメータは使用されません。

個々のユーザーへの十分なメモリーの割当て

SGAをサイズ設定する場合は、個々のサーバー・プロセスとその他のプログラムがシステム上で作動するように十分なメモリーを使用できるようにします。

構成での繰返し

メモリーの割当てを構成する場合は、アプリケーションの必要性により異なりますが、Oracle Databaseメモリー構造に使用可能なメモリーを配分します。Oracle Databaseの構造にメモリーを配分すると、Oracle Databaseが正常に動作するために必要な物理I/O量に影響を与える可能性があります。最初にメモリーを適切に構成しておくと、I/Oシステムが効果的に構成されているかどうかがわかります。

メモリー構成プロセスをひととおり実行した後で、メモリー割当てのステップを繰り返すことが必要となる可能性もあります。実行を繰り返すことによって、後のステップの変更に基づいて前のステップの調整が可能となります。たとえば、バッファ・キャッシュのサイズを小さくすると、共有プールなど別のメモリー構造のサイズを大きくできます。

共有メモリー管理の監視

表12-1に、SGAのサイズ変更操作に関する情報が表示されるビューを示します。

表12-1 共有メモリー管理ビュー

ビュー 説明

V$SGA_CURRENT_RESIZE_OPS

現在進行中のSGAのサイズ変更操作に関する情報が表示されます。

V$SGA_RESIZE_OPS

最後に完了した800件のSGAのサイズ変更操作に関する情報が表示されます。これには現在進行中の操作は含まれません。

V$SGA_DYNAMIC_COMPONENTS

SGAの動的コンポーネントに関する情報が表示されます。このビューでは、インスタンスの起動後に発生したすべての実行済SGAサイズ変更操作に関する情報が要約されます。

V$SGA_DYNAMIC_FREE_MEMORY

将来の動的なSGAサイズ変更操作に使用可能なSGAメモリーの容量に関する情報が表示されます。

関連項目:

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

インメモリー列ストアによる問合せパフォーマンスの改善

インメモリー列ストア(IM列ストア)は任意のシステム・グローバル領域(SGA)です。ここには、表、パーティションおよびその他のデータベース・オブジェクトのコピーが列形式で格納されています。この列データは迅速にスキャンできるように最適化されています。IM列ストアはデータベース・オブジェクトをメモリー内に格納するため、ディスク上に格納されたデータに対してスキャン、問合せ、結合、およびそのデータの集計を実行した場合と比較して、Oracle Databaseはこれらの操作をはるかに速く実行できます。

ノート:

  • IM列ストアおよびデータベース・バッファ・キャッシュには、同じデータが異なるフォーマットで保存されます。IM列ストアはデータベース・バッファ・キャッシュの行ベースのストレージを置き換えるものではなく、問合せのパフォーマンスを改善するための補足的な役割を果たします。

  • IM列ストアは、Oracle Database 12cリリース1(12.1.0.2)から使用可能です。

関連項目:

IM列ストアの詳細は、Oracle Database In-Memoryガイドを参照してください

Memoptimizeされた行ストアを使用した高パフォーマンス・データ・ストリーミングの有効化

Memoptimizeされた行ストアを使用すると、モノのインターネット(IoT)などのアプリケーションで高パフォーマンス・データ・ストリーミングが可能になります。

この項では、次の項目について説明します。

Memoptimizeされた行ストアについて

Memoptimizeされた行ストアを使用すると、モノのインターネット(IoT)アプリケーションなどのアプリケーションで高パフォーマンス・データ・ストリーミングが可能になります。通常、IoTでは、多数のクライアントからの単一行挿入の少量のデータを同時にストーリミングし、非常に高頻度でクライアントのデータを問い合せます。

Memoptimizeされた行ストアには次の機能があります。

  • 高速収集

    高速収集では、データベースへの高頻度の単一行データの挿入処理が最適化されます。高速収集では、ディスクに書き込む前に挿入をバッファリングするためにラージ・プールが使用され、データ挿入パフォーマンスが向上します。

  • 高速参照

    高速参照を使用すると、高頻度の問合せのためにデータベースからデータを高速取得できます。高速参照では、表から問い合せたデータをバッファリングするためにMemoptimizeプールと呼ばれるSGA内の別のメモリー領域が使用され、問合せのパフォーマンスが向上します。

    ノート:

    高速参照を使用する場合は、MEMOPTIMIZE_POOL_SIZE初期化パラメータを使用して、Memoptimizeプールに適切なメモリー・サイズを割り当てる必要があります。

高速収集の使用

高速収集では、モノのインターネット(IoT)アプリケーションなどのアプリケーションからデータベースに高頻度で単一行データを挿入する処理が最適化されます。

高速収集では、MEMOPTIMIZE_WRITEヒントを使用して、MEMOPTIMIZE FOR WRITEとして指定された表にデータを挿入します。データベースは、これらの挿入をラージ・プールに一時的にバッファリングし、これらのバッファリングされた挿入をディスクに書き込むときに変更を自動的にコミットします。この変更はロールバックできません。

高速収集を使用した挿入は、遅延挿入とも呼ばれます。これは、最初はラージ・プールにバッファリングされ、後でバックグラウンド・プロセスによって非同期にディスクに書き込まれるためです。

表にデータを挿入するために高速収集を使用するステップ

表にデータを挿入するために高速収集を使用するステップは、次のとおりです。

  1. 表で高速収集を有効にするには、CREATE TABLE文またはALTER TABLE文でMEMOPTIMIZE FOR WRITE句を指定します。

    SQL> create table test_fast_ingest (
    id number primary key,
    test_col varchar2(15))
    segment creation immediate
    memoptimize for write;
    
    Table created.

    詳細は、高速収集用の表の有効化を参照してください。

  2. INSERT文でMEMOPTIMIZE_WRITEヒントを指定することで、挿入での高速収集を有効にします。

    次に、高速収集について、使用方法ではなくメカニズムを説明します。

    SQL> insert /*+ memoptimize_write */ into test_fast_ingest values (1, 'test');
    
    1 row created
    
    SQL> insert /*+ memotimize_write */ into test_fast_ingest values (2, 'test');
    
    1 row created

    詳細は、データ挿入に高速収集を使用するためのヒントの指定を参照してください。

前述の2つの挿入の結果として、SGAのラージ・プール内の収集バッファにデータが書き込まれます。ある時点で、そのデータがTEST_FAST_INGEST表にフラッシュされます。それが起こるまでは、そのデータは永続的ではありません。

高速収集の目的は高パフォーマンスなデータ・ストリーミングをサポートすることであるため、より現実的なアーキテクチャには、1つ以上のアプリケーションまたは収集サーバーでデータを収集してデータベースに挿入をバッチ処理することが含まれます。

初めて挿入を実行すると、ラージ・プールから高速収集領域が割り当てられます。割り当てられたメモリーの量は、alert.logに書き込まれます。

Memoptimize Write allocated 2055M from large pool

リクエストで最小メモリー要件さえ割当てに失敗した場合、エラー・メッセージがalert.logに書き込まれます。

Memoptimize Write disabled. Unable to allocate sufficient memory from large pool.

高速収集の詳細

高速収集の目的は、集計に重要な値が含まれている多くの情報データを生成するが必ずしもすべてのACID保証が必要なわけではないアプリケーションをサポートすることです。モノのインターネット(IoT)における多くのアプリケーションには、センサー・データ、スマート・メーター・データまたはトラフィック・カメラなど、時間のかからないボタンを押すだけでよいタイプのワークロードがあります。これらのアプリケーションでは、データは、収集され、その後の分析のために大量にデータベースに書き込まれる場合があります。

次の図では、Memoptimizeされた行ストアの高速収集機能がこのようなケースでどのように使用されるかを示します。

図12-1 高頻度の挿入での高速収集

図12-1の説明が続きます。
「図12-1 高頻度の挿入での高速収集」の説明

収集されたデータはラージ・プールにバッチされ、すぐにはデータベースに書き込まれません。このため、収集プロセスは非常に高速になります。個々の行を処理する必要なく、非常に大量のデータを効率的に収集できます。ただし、収集されたデータがデータベース・ファイルに書き込まれる前にデータベースが停止すると、データが失われる可能性があります。

高速収集は、通常のOracle Databaseトランザクション処理とはまったく異なります。この機能では、データはログ記録され、データベースに一旦書き込まれると(つまり、コミットされると)失われることがありません。最大限の収集処理能力を実現するために、通常のOracleトランザクション・メカニズムは無視されます。すべてのデータが実際にデータベースに書き込まれているかどうかは、そのアプリケーションで確認する必要があります。データがデータベースに書き込まれたかどうかを確認するために呼び出すことができる、特別なAPIが追加されました。

高速収集のコンテキストの場合、commit操作は意味を持ちません。これはOracleにおける従来の意味でのトランザクションではないためです。挿入をロールバックする機能はありません。高速収集バッファからディスクにフラッシュされるまで、データの問合せもできません。ビューV$MEMOPTIMIZE_WRITE_AREAを問い合せることで、高速収集バッファに関する管理情報を確認できます。

また、パッケージDBMS_MEMOPTIMIZEおよびDBMS_MEMOPTIMIZE_ADMINを使用して、ラージ・プールから高速収集データをフラッシュする機能や、フラッシュされたデータの順序IDを決定する機能などを実行できます。

索引操作および制約チェックは、データがラージ・プール内の高速収集領域からディスクに書き込まれるときにのみ実行されます。バックグラウンド・プロセスでデータがディスクに書き込まれるときに主キー違反が発生した場合は、データベースによってこれらの行がデータベースに書き込まれることはありません。

すべてではありませんがほとんどのアプリケーションについては、挿入したすべてのデータをデータベースに書き込む必要があると仮定すると、アプリケーションの挿入プロセスで、挿入したデータが実際にデータベースに書き込まれたことを確認してからそのデータを破棄するようにすることが重要です。その確認が行われた場合のみ、挿入側プロセスからデータを削除できます。

高速収集表の前提条件

特定の特性やオブジェクト、パーティション化がある表では、高速収集はサポートされません。

自律型データベースでアイテムがサポートされ、その制限がない場合はその旨が記載されています。

  • 次の特性を持つ表では高速収集を使用できません。

    • ディスク圧縮
    • インメモリー圧縮
    • ファンクション索引
    • ドメイン索引
    • ビットマップ索引
    • ビットマップ結合索引
    • ref型
    • varray型
    • OID$型
    • 未使用列
    • LOB
    • トリガー
    • バイナリ列
    • 外部キー
    • 行のアーカイブ
    • 非表示列[自律型データベースは仮想列をサポートしています。]
  • 次のオブジェクトでは高速収集を使用できません。

    • 一時表
    • ネストした表
    • 索引構成表
    • 外部表
    • オンデマンド・リフレッシュがあるマテリアライズド・ビュー
    • サブパーティション化はサポートされていません。[自律型データベースはサブパーティション化をサポートしています。]
  • 次のパーティション化タイプはサポートされていません。

    • REFERENCE
    • SYSTEM
    • INTERVAL [自律型データベースはこれをサポートしています。]
    • AUTOLIST [自律型データベースはこれをサポートしています。]

高速収集に関するその他の考慮事項を次に示します。

  • すべてではありませんがほとんどのアプリケーションについては、挿入したすべてのデータをデータベースに書き込む必要があると仮定すると、アプリケーションの実装プロセスで、挿入したデータが実際にデータベースに書き込まれたことを確認してからそのデータを破棄するようにすることが重要です。その確認が行われた場合のみ、挿入側プロセスからデータを削除できます。

  • 高速収集では、ラージ・プールにデータをバッファリングするため、システム障害の発生時にデータが失われる可能性があります。データの損失を回避するには、データがディスクに書き込まれる前にシステム障害が発生した場合に挿入を再現できるように、クライアントは挿入実行後にデータのローカル・コピーを保持する必要があります。クライアントは、DBMS_MEMOPTIMIZEパッケージのサブプログラムを使用して、挿入の永続性を追跡できます。挿入がディスクに書き込まれたら、クライアントは挿入されたデータのローカル・コピーを破棄できます。

  • 問合せはラージ・プールからデータを読み取らないため、高速収集を使用して挿入されたデータはディスクに書き込まれるまで問合せできません。

  • 索引操作は、通常の挿入と同様に高速収集によってサポートされます。ただし、高速収集の場合、データベースはデータをディスクに書き込むときに索引操作を実行し、ラージ・プールにデータを書き込むときには実行しません。

  • ラージ・プール内の高速収集バッファに割り当てられたサイズは、作成後は固定となります。バッファがいっぱいになると、バックグラウンド・プロセスでバッファが排出されるまで、それ以降の収集は待機状態になります。

ノート:

高速収集と高速参照の両方を使用するように表を構成できます。

表への高速収集の有効化

表で高速収集を有効にするには、CREATE TABLE文またはALTER TABLE文でMEMOPTIMIZE FOR WRITE句を指定します。

表で高速収集を有効にするには:

  1. SQL*Plusで、ALTER TABLE権限を持つユーザーとしてデータベースにログインします。

  2. MEMOPTIMIZE FOR WRITE句を指定したCREATE TABLEまたはALTER TABLE文を実行します。

    次の例では、新しい表test_fast_ingestを作成し、高速収集を有効にしています。

    CREATE TABLE test_fast_ingest (
         id        NUMBER(5) PRIMARY KEY,
         test_col  VARCHAR2(15))
      SEGMENT CREATION IMMEDIATE
      MEMOPTIMIZE FOR WRITE;

    次の例では、既存の表hr.employeesで高速収集を有効にしています。

    ALTER TABLE hr.employees MEMOPTIMIZE FOR WRITE;
データ挿入に高速収集を使用するためのヒントの指定

INSERT文でMEMOPTIMIZE_WRITEヒントを指定すると、データ挿入に高速収集を使用できます。

前提条件

このタスクでは、次のことを前提としています。

  • 表ですでに高速収集が有効になっています。

  • オプティマイザでヒントの使用が許可されています(optimizer_ignore_hints=FALSE)。

データ挿入に高速収集を使用するには:

  1. SQL*Plusで、データを表に挿入する権限を持つユーザーとしてデータベースにログインします。

  2. 高速収集がすでに有効になっている表に対して、MEMOPTIMIZE_WRITEヒントを指定してINSERT文を実行します。

    次に例を示します。

    INSERT  /*+ MEMOPTIMIZE_WRITE */ INTO test_fast_ingest VALUES (1,'test');
表への高速収集の無効化

ALTER TABLE文でNO MEMOPTIMIZE FOR WRITE句を指定すると、表で高速収集を無効にできます。

表で高速収集を無効にするには:

  1. SQL*Plusで、ALTER TABLE権限を持つユーザーとしてデータベースにログインします。

  2. NO MEMOPTIMIZE FOR WRITE句を指定したALTER TABLE文を実行します。

    次の例では、表hr.employeesで高速収集を無効にしています。

    ALTER TABLE hr.employees NO MEMOPTIMIZE FOR WRITE;
ラージ・プール内の高速収集データの管理

V$MEMOPTIMIZE_WRITE_AREAビューを使用すると、ラージ・プール内の高速収集データを表示できます。パッケージDBMS_MEMOPTIMIZEおよびDBMS_MEMOPTIMIZE_ADMINのサブプログラムを使用して、ラージ・プール内の高速収集データを表示および制御することもできます。

V$MEMOPTIMIZE_WRITE_AREAビューの概要

V$MEMOPTIMIZE_WRITE_AREAビューは、高速収集によるラージ・プールでのメモリー使用量およびデータ挿入に関する次の情報を提供します。

  • ラージ・プール内で高速収集データ用に割り当てられているメモリー量の合計

  • ラージ・プール内で高速収集データに現在使用されているメモリー量の合計

  • ラージ・プールに高速収集データを格納するために現在空いているメモリー量の合計

  • データがラージ・プールにあり、まだディスクに書き込まれていない高速収集の挿入操作の数

  • データベースにデータを挿入するために現在高速収集を使用しているクライアントの数

関連項目:

V$MEMOPTIMIZE_WRITE_AREAビューの詳細は、『Oracle Databaseリファレンス』を参照してください

DBMS_MEMOPTIMIZEパッケージのサブプログラムの概要

DBMS_MEMOPTIMIZEパッケージの次のサブプログラムを使用して、ラージ・プールの高速収集データを表示および制御できます。

サブプログラム 説明

GET_APPLY_HWM_SEQID

すべてのセッションでディスクに正常に書き込まれたデータ・レコードの低い最高水位標(低いHWM)の順序番号を返します。

GET_WRITE_HWM_SEQID

現在のセッションでラージ・プールに書き込まれたデータ・レコードの最高水位標(HWM)の順序番号を返します。

WRITE_END

現行セッションのすべての高速収集データをラージ・プールからディスクにフラッシュします。

関連項目:

DBMS_MEMOPTIMIZEパッケージの詳細は、Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンスを参照してください

DBMS_MEMOPTIMIZE_ADMINパッケージのサブプログラムの概要

DBMS_MEMOPTIMIZE_ADMINパッケージの次のサブプログラムを使用して、ラージ・プールの高速収集データを制御できます。

サブプログラム 説明

WRITES_FLUSH

すべてのセッションのすべての高速収集データをラージ・プールからディスクにフラッシュします。

関連項目:

DBMS_MEMOPTIMIZE_ADMINパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください

高速参照の使用

高速参照により、モノのインターネット(IoT)アプリケーションなどのアプリケーションでデータベース表からの高速データ取得が可能になります。

高速参照では、Memoptimizeプールと呼ばれるSGAバッファ領域に格納されているハッシュ索引を使用し、バッファ・キャッシュに永続的に固定されている表のブロックに高速にアクセスできるため、ディスクI/Oが回避され、問合せのパフォーマンスが向上します。

表の高速参照を使用するステップ

表の高速参照を使用するステップは、次のとおりです。

  1. Memoptimizeプールの有効化

    このタスクは、MEMOPTIMIZE_POOL_SIZE初期化パラメータをゼロ以外の値に設定することによって実現されます。

    詳細は、Memoptimizeプールの有効化を参照してください。

  2. 表の高速参照の有効化

    このタスクを実現するには、CREATE TABLE文またはALTER TABLE文でMEMOPTIMIZE FOR READ句を指定します。

    詳細は、表の高速参照の有効化を参照してください。

高速参照の使用に関する制限事項

高速参照の使用に関する制限事項を以下に示します。

  • 高速参照が有効な表は圧縮できません。

  • 高速参照が有効な表には主キー制約を有効にする必要があります。

ノート:

高速収集と高速参照の両方を使用するように表を構成できます。

関連項目:

Memoptimizeプールの有効化

高速参照を使用する前に、Memoptimizeプールを有効にする必要があります。MemoptimizeプールはSGAに存在し、高速参照が有効にされた表のデータとハッシュ索引を格納します。

前提条件

このタスクは、COMPATIBLE初期化パラメータが18.0.0以上に設定されていることを想定しています。

Memoptimizeプールを有効にするには:

  1. SQL*Plusで、管理権限を持つユーザーとしてデータベースにログインします。

  2. MEMOPTIMIZE_POOL_SIZE初期化パラメータをゼロ以外の値に設定します。最小設定は100 MBです。ALTER SYSTEM文を使用してサーバー・パラメータ・ファイル(SPFILE)でこの初期化パラメータを設定する場合、SCOPE=SPFILEを指定する必要があります。

    たとえば、次の文では、Memoptimizeプールのサイズを10 GBに設定します。

    ALTER SYSTEM SET MEMOPTIMIZE_POOL_SIZE = 10G SCOPE=SPFILE;
  3. データベースを再起動して、変更を有効にします。

例: Memoptimizeプールの有効化

MEMOPTIMIZE_POOL_SIZE初期化パラメータが0に初期設定されていることが前提です。次の例では、MEMOPTIMIZE_POOL_SIZEを10 GBに設定することで、Memoptimizeプールを有効にしています。

SQL> SHOW PARAMETER MEMOPTIMIZE_POOL_SIZE

NAME                   TYPE         VALUE
---------------------  -----------  -----
memoptimize_pool_size  big integer  0

SQL> ALTER SYSTEM SET MEMOPTIMIZE_POOL_SIZE=10G SCOPE=SPFILE;

System altered.

SQL> SHUTDOWN IMMEDIATE
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> STARTUP
ORACLE instance started.

Total System Global Area 1.1832E+10 bytes
Fixed Size                  9010864 bytes
Variable Size            1.1799E+10 bytes
Database Buffers           16777216 bytes
Redo Buffers                7766016 bytes
Database mounted.
Database opened.

SQL> SHOW PARAMETER MEMOPTIMIZE_POOL_SIZE

NAME                   TYPE         VALUE
---------------------  -----------  -----
memoptimize_pool_size  big integer  10G

ノート:

MEMOPTIMIZE_POOL_SIZE値はSGA_TARGETの対象ですが、データベースはmemoptimizeプールを自動では拡大および縮小しません。たとえば、SGA_TARGETが10 GBで、 MEMOPTIMIZE_POOL_SIZEが1 GBの場合、使用可能なSGAメモリーはmemoptimizeプール以外の合計9 GBです。

関連項目:

表の高速参照の有効化

表の高速参照を有効にするには、CREATE TABLE文またはALTER TABLE文にMEMOPTIMIZE FOR READ句を指定します。

前提条件

このタスクはMemoptimizeプールが有効であることを前提としています。

表の高速参照を有効にするには:

  1. SQL*Plusで、ALTER TABLE権限を持つユーザーとしてデータベースにログインします。

  2. 高速参照を有効にする必要がある表に対して、MEMOPTIMIZE FOR READ句を指定したCREATE TABLE文またはALTER TABLE文を実行します。

    次の例では、新しい表test_fast_lookupを作成し、高速参照を有効にしています。

    CREATE TABLE test_fast_lookup (
         id        NUMBER(5) PRIMARY KEY,
         test_col  VARCHAR2(15))
      MEMOPTIMIZE FOR READ;

    次の例では、既存のhr.employees表の高速参照が有効になります。

     ALTER TABLE hr.employees MEMOPTIMIZE FOR READ;
表の高速参照の無効化

表の高速参照を無効にするには、ALTER TABLE文にNO MEMOPTIMIZE FOR READ句を指定します。

前提条件

このタスクでは、表で高速参照がすでに有効にされていることを前提としています。

表の高速参照を無効にするには:

  1. SQL*Plusで、ALTER TABLE権限を持つユーザーとしてデータベースにログインします。

  2. 高速参照を無効にする必要がある表に対して、NO MEMOPTIMIZE FOR READ句を指定してALTER TABLE文を実行します。

    次の例では、hr.employees表の高速参照を無効にしています。

    ALTER TABLE hr.employees NO MEMOPTIMIZE FOR READ;
    
Memoptimizeプールの高速参照データの管理

Memoptimizeプールには、高速参照が有効にされているすべての表のデータ(高速参照データ)が格納されます。DBMS_MEMOPTIMIZEパッケージのサブプログラムを使用して、Memoptimizeプールの表の高速参照データを明示的に削除または移入できます。

DBMS_MEMOPTIMIZEパッケージのサブプログラムの概要

Memoptimizeプール内の表の高速参照データを削除または移入するために使用できるDBMS_MEMOPTIMIZEパッケージのサブプログラムを次に示します。

サブプログラム 説明

DROP_OBJECT

Memoptimizeプールから表の高速参照データを削除します。

POPULATE

Memoptimizeプールに表の高速参照データを移入します。

関連項目: