14 システム・グローバル領域のチューニング
この章では、システム・グローバル領域(SGA)のチューニング方法を説明します。自動メモリー管理を使用してシステムのデータベース・メモリーを管理している場合は、この章で説明されているように、SGAのチューニングは必要ありません。
この章のトピックは、次のとおりです:
統合メモリーの使用
統合メモリーは、Oracle Database 23ai (以上)の柔軟で単純なメモリー構成で、単一のパラメータを使用してデータベース・メモリー割当てを制御します。これにより、システムの再起動によるメモリー構成の変更の必要性が軽減または排除されます。統合メモリーは、複数のワークロードの高密度データベース統合環境で特に役立ちます。
統合メモリーにより、メモリー管理が簡素化され、中断を最小限に抑えながら高度に統合された環境で複数のワークロードを実行できます。SGA_TARGETやPGA_AGGREGATE_LIMITなどの個別のパラメータを使用するかわりに、データベース・インスタンス・メモリーを構成するための単一パラメータMEMORY_SIZEを設定する方が簡単です。
自動共有メモリー管理の使用
自動共有メモリー管理を使用すると、SGAのメモリーが次のメモリー・プールに自動的に配分され、SGAの構成が簡略化されます。
-
データベース・バッファ・キャッシュ(デフォルト・プール)
-
共有プール
-
ラージ・プール
-
Javaプール
-
Streamsプール
自動共有メモリー管理は、SGA_TARGETパラメータで制御します。SGA_TARGETパラメータの値を変更すると、これらのメモリー・プールが自動的にサイズ変更されます。これらのメモリー・プールがゼロ以外の値に設定されている場合、自動共有メモリー管理では、これらの値が最低レベルとして使用されます。最低値は、アプリケーション・コンポーネントが正しく機能するために必要な最低メモリー量に基づいて設定することをお薦めします。
次に示すメモリー・キャッシュは手動でサイズ設定されるコンポーネントで、自動共有メモリー管理の制御対象ではありません。
-
REDOログ・バッファ
REDOログ・バッファは、「REDOログ・バッファの構成」で説明されているように、
LOG_BUFFER初期化パラメータを使用してサイズ設定されます。 -
その他のバッファ・キャッシュ(
KEEP、RECYCLEおよび他の非デフォルト・ブロック・サイズなど)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_TARGETパラメータを設定するためのユーザー・インタフェース
この項では、SGA_TARGETパラメータの値を設定するためのユーザー・インタフェースについて説明します。
この項では、次の項目について説明します。
Oracle Enterprise Manager Cloud ControlでのSGA_TARGETパラメータの設定
メモリー・パラメータSGAページからSGAサイズ・アドバイザにアクセスすることにより、Oracle Enterprise Manager Cloud Control (Cloud Control)でSGA_TARGETパラメータの値を変更できます。
SGA_TARGETパラメータの設定
この項では、SGA_TARGETパラメータの値を設定して、自動共有メモリー管理を有効化および無効化する方法を説明します。
この項では、次の項目について説明します。
自動共有メモリー管理の有効化
自動共有メモリー管理を有効化するには、次の初期化パラメータを設定します。
-
STATISTICS_LEVELをTYPICALまたは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のサイズ設定単位
SGA内の動的コンポーネント(バッファ・キャッシュ、共有プール、ラージ・プールおよびJavaプールを含む)のメモリーは、グラニュルの単位で割り当てられます。グラニュル・サイズは、インスタンスが起動するときに要求されるSGAメモリーの量によって決まります。グラニュル・サイズは、SGA_MAX_SIZE初期化パラメータの値に基づいています。このサイズは、インスタンスの存続期間中は変化しません。
表14-1 グラニュル・サイズ
| SGAメモリーの量 | グラニュル・サイズ |
|---|---|
|
1GB以下 |
4 MB |
|
1GBより大きく8GB以下 |
16 MB |
|
8GBより大きく16GB以下 |
32 MB |
|
16 GBより大きい |
64 MB |
それと同じグラニュルのサイズがSGAのすべての動的コンポーネントで使用されます。
インスタンスで使用中のグラニュル・サイズを確認するには、V$SGAINFOビューを使用します。
SGAで使用されているグラニュル・サイズを確認するには、V$SGA_DYNAMIC_COMPONENTSビューを使用します。
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 AI Databaseメモリー構造にメモリーを割り当ててください。
-
既存のアプリケーションに変更または追加を行う場合は、変更されたアプリケーションの必要性に対応するようOracle AI 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
構成での繰返し
メモリーの割当てを構成する場合は、アプリケーションの必要性により異なりますが、Oracle AI Databaseメモリー構造に使用可能なメモリーを配分します。Oracle AI Databaseの構造にメモリーを配分すると、データベースが正常に動作するために必要な物理I/O量に影響を与える可能性があります。最初にメモリーを適切に構成しておくと、I/Oシステムが効果的に構成されているかどうかがわかります。
メモリー構成プロセスをひととおり実行した後で、メモリー割当てのステップを繰り返すことが必要となる可能性もあります。実行を繰り返すことによって、後のステップの変更に基づいて前のステップの調整が可能となります。たとえば、バッファ・キャッシュのサイズを小さくすると、共有プールなど別のメモリー構造のサイズを大きくできます。
共有メモリー管理の監視
表14-2では、SGAのサイズ変更操作に関する情報が表示されるビューを示します。
表14-2 共有メモリー管理ビュー
| ビュー | 説明 |
|---|---|
|
|
現在進行中のSGAのサイズ変更操作に関する情報が表示されます。 |
|
|
最後に完了した800件のSGAのサイズ変更操作に関する情報が表示されます。これには現在進行中の操作は含まれません。 |
|
|
SGAの動的コンポーネントに関する情報が表示されます。このビューでは、インスタンスの起動後に発生したすべての実行済SGAサイズ変更操作に関する情報が要約されます。 |
|
|
将来の動的なSGAサイズ変更操作に使用可能なSGAメモリーの容量に関する情報が表示されます。 |
関連項目:
これらのビューについては、『Oracle Databaseリファレンス』を参照してください。
インメモリー列ストアによる問合せパフォーマンスの改善
インメモリー列ストア(IM列ストア)は任意のシステム・グローバル領域(SGA)です。ここには、表、パーティションおよびその他のデータベース・オブジェクトのコピーが列形式で格納されています。この列データは迅速にスキャンできるように最適化されています。IM列ストアではデータベース・オブジェクトがメモリー内に配置されるため、Oracle AI Databaseでは、そのデータに対するスキャン、問合せ、結合および集計を、行形式で格納されているデータよりもはるかに迅速に実行できます。
ノート:
-
IM列ストアおよびデータベース・バッファ・キャッシュには、同じデータが異なるフォーマットで保存されます。IM列ストアはデータベース・バッファ・キャッシュの行ベースのストレージを置き換えるものではなく、問合せのパフォーマンスを改善するための補足的な役割を果たします。
インメモリー・スキャンは、表内のすべての列がIM列ストアに移入されているわけではない場合にも実行できます。この状況は、領域を節約するために列がNO INMEMORYと指定されている場合に発生することがあります。
インメモリー・ハイブリッド・スキャンでは、IM列ストアの一部のデータに、また行ストアの一部のデータにアクセスできるため、純粋な行ストア問合せより桁違いにパフォーマンスが向上します。その問合せは2つの部分に分けられ、1つはIM列ストアをスキャンしてフィルタを実行し、もう1つは行ストアをスキャンしてフィルタ済の問合せ結果を投影します。
関連項目:
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として指定された表にデータを挿入します。データベースは、これらの挿入をラージ・プールに一時的にバッファリングし、これらのバッファリングされた挿入をディスクに書き込むときに変更を自動的にコミットします。この変更はロールバックできません。
高速収集を使用した挿入は、遅延挿入とも呼ばれます。これは、最初はラージ・プールにバッファリングされ、後でバックグラウンド・プロセスによって非同期にディスクに書き込まれるためです。
表にデータを挿入するために高速収集を使用するステップ
表にデータを挿入するために高速収集を使用するステップは、次のとおりです。
-
表で高速収集を有効にするには、
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.詳細は、高速収集用の表の有効化を参照してください。
-
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された行ストアの高速収集機能がこのようなケースでどのように使用されるかを示します。
収集されたデータはラージ・プールにバッチされ、すぐにはデータベースに書き込まれません。このため、収集プロセスは非常に高速になります。個々の行を処理する必要なく、非常に大量のデータを効率的に収集できます。ただし、収集されたデータがデータベース・ファイルに書き込まれる前にデータベースが停止すると、データが失われる可能性があります。
高速収集は、通常のOracle AI Databaseトランザクション処理とはまったく異なります。この機能では、データはログ記録され、データベースに一旦書き込まれると(つまり、コミットされると)失われることがありません。最大限の収集処理能力を実現するために、通常のOracleトランザクション・メカニズムは無視されます。すべてのデータが実際にデータベースに書き込まれているかどうかは、そのアプリケーションで確認する必要があります。データがデータベースに書き込まれたかどうかを確認するために呼び出すことができる、特別なAPIが追加されました。
高速収集のコンテキストの場合、commit操作は意味を持ちません。これはOracleにおける従来の意味でのトランザクションではないためです。挿入をロールバックする機能はありません。高速収集バッファからディスクにフラッシュされるまで、データの問合せもできません。ビューV$MEMOPTIMIZE_WRITE_AREAを問い合せることで、高速収集バッファに関する管理情報を確認できます。
また、パッケージDBMS_MEMOPTIMIZEおよびDBMS_MEMOPTIMIZE_ADMINを使用して、ラージ・プールから高速収集データをフラッシュする機能や、フラッシュされたデータの順序IDを決定する機能などを実行できます。
索引操作および制約チェックは、データがラージ・プール内の高速収集領域からディスクに書き込まれるときにのみ実行されます。バックグラウンド・プロセスでデータがディスクに書き込まれるときに主キー違反が発生した場合は、データベースによってこれらの行がデータベースに書き込まれることはありません。
すべてではありませんがほとんどのアプリケーションについては、挿入したすべてのデータをデータベースに書き込む必要があると仮定すると、アプリケーションの挿入プロセスで、挿入したデータが実際にデータベースに書き込まれたことを確認してからそのデータを破棄するようにすることが重要です。その確認が行われた場合のみ、挿入側プロセスからデータを削除できます。
関連項目:
-
遅延挿入メカニズムの詳細は、Oracle AI Database概要を参照してください
高速収集表の前提条件
特定の特性やオブジェクト、パーティション化がある表では、高速収集はサポートされません。
表にBFILEデータ型の少なくとも1つの列が含まれている場合、または表に255を超える列が含まれている場合、高速収集はサポートされていません。
自律型データベースでアイテムがサポートされ、その制限がない場合はその旨が記載されています。
-
次の特性を持つ表では高速収集を使用できません。
- ディスク圧縮
- インメモリー圧縮
- ファンクション索引
- ドメイン索引
- ビットマップ索引
- ビットマップ結合索引
- 列のデフォルト値[自律型データベースは列のデフォルト値をサポートしています]
- 暗号化[自律型データベースは暗号化をサポートしています]
- ref型
- varray型
- OID$型
- 未使用列
- LOB [自律型データベースはインラインLOBをサポートしています。]
- トリガー
- バイナリ列
- 外部キー
- 行のアーカイブ
- 非表示列
- 仮想列[自律型データベースは仮想列をサポートしています。]
-
次のオブジェクトでは高速収集を使用できません。
- 一時表
- ネストした表
- 索引構成表
- 外部表
- オンデマンド・リフレッシュがあるマテリアライズド・ビュー
- サブパーティション化はサポートされていません。[自律型データベースはサブパーティション化をサポートしています。]
-
次のパーティション化タイプはサポートされていません。
- REFERENCE
- SYSTEM
- INTERVAL [自律型データベースはこれをサポートしています。]
- AUTOLIST [自律型データベースはこれをサポートしています。]
一意でない索引を使用した一意制約
高速収集では、一意でない索引を使用して強制される一意制約はサポートされません。これを試行する無効なSQLコード・スニペットを次に示します。
drop table t1;
create table t1 (c1 number, c2 number) memoptimize for write;
insert /*+ memoptimize_write */ into t1 values (20, 20);
create index ti on t1 (c1,c2);
alter table t1 add primary key (c1, c2) using index ti;
exec dbms_memoptimize.write_end;
Creating the index - "create index ti on t1 (c1,c2);
[...]
Error ORA-600前述の例では、フラッシュ中にError ORA-600がスローされます。
高速収集に関するその他の考慮事項
高速収集に関するその他の考慮事項を次に示します。
-
すべてではありませんがほとんどのアプリケーションについては、挿入したすべてのデータをデータベースに書き込む必要があると仮定すると、アプリケーションの実装プロセスで、挿入したデータが実際にデータベースに書き込まれたことを確認してからそのデータを破棄するようにすることが重要です。その確認が行われた場合のみ、挿入側プロセスからデータを削除できます。
-
高速収集では、ラージ・プールにデータをバッファリングするため、システム障害の発生時にデータが失われる可能性があります。データの損失を回避するには、データがディスクに書き込まれる前にシステム障害が発生した場合に挿入を再現できるように、クライアントは挿入実行後にデータのローカル・コピーを保持する必要があります。クライアントは、
DBMS_MEMOPTIMIZEパッケージのサブプログラムを使用して、挿入の永続性を追跡できます。挿入がディスクに書き込まれたら、クライアントは挿入されたデータのローカル・コピーを破棄できます。 -
問合せはラージ・プールからデータを読み取らないため、高速収集を使用して挿入されたデータはディスクに書き込まれるまで問合せできません。
-
索引操作は、通常の挿入と同様に高速収集によってサポートされます。ただし、高速収集の場合、データベースはデータをディスクに書き込むときに索引操作を実行し、ラージ・プールにデータを書き込むときには実行しません。
-
ラージ・プール内の高速収集バッファに割り当てられたサイズは、作成後は固定となります。バッファがいっぱいになると、バックグラウンド・プロセスでバッファが排出されるまで、それ以降の収集は待機状態になります。
-
フラッシュ順序はオブジェクト内で維持されます。表が(サブ)パーティション化されている場合、行順序は表レベルではなく(サブ)パーティション・レベルで維持されます。
-
特定のセッションで高速収集が動作している場合、他のセッションによる表に対する操作(追加/削除)を実行できないロックが表に置かれます。ロックを削除するには、高速収集挿入暗黙的コミットとは別に、さらに1つの
COMMITを手動で発行する必要があります。
ノート:
高速収集と高速参照の両方を使用するように表を構成できます。
表への高速収集の有効化
表で高速収集を有効にするには、CREATE TABLE文またはALTER TABLE文でMEMOPTIMIZE FOR WRITE句を指定します。
表で高速収集を有効にするには:
-
SQL*Plusで、
ALTER TABLE権限を持つユーザーとしてデータベースにログインします。 -
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)。
データ挿入に高速収集を使用するには:
-
SQL*Plusで、データを表に挿入する権限を持つユーザーとしてデータベースにログインします。
-
高速収集がすでに有効になっている表に対して、
MEMOPTIMIZE_WRITEヒントを指定してINSERT文を実行します。たとえば:
INSERT /*+ MEMOPTIMIZE_WRITE */ INTO test_fast_ingest VALUES (1,'test');
関連項目:
表への高速収集の無効化
ALTER TABLE文でNO MEMOPTIMIZE FOR WRITE句を指定すると、表で高速収集を無効にできます。
表で高速収集を無効にするには:
-
SQL*Plusで、
ALTER TABLE権限を持つユーザーとしてデータベースにログインします。 -
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 AI Databaseリファレンスを参照してください
DBMS_MEMOPTIMIZEパッケージのサブプログラムの概要
DBMS_MEMOPTIMIZEパッケージの次のサブプログラムを使用して、ラージ・プールの高速収集データを表示および制御できます。
| サブプログラム | 説明 |
|---|---|
|
|
すべてのセッションでディスクに正常に書き込まれたデータ・レコードの低い最高水位標(低いHWM)の順序番号を返します。 |
|
|
現在のセッションでラージ・プールに書き込まれたデータ・レコードの最高水位標(HWM)の順序番号を返します。 |
|
|
現行セッションのすべての高速収集データをラージ・プールからディスクにフラッシュします。 |
関連項目:
DBMS_MEMOPTIMIZEパッケージについては、Oracle AI Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください
DBMS_MEMOPTIMIZE_ADMINパッケージのサブプログラムの概要
DBMS_MEMOPTIMIZE_ADMINパッケージの次のサブプログラムを使用して、ラージ・プールの高速収集データを制御できます。
| サブプログラム | 説明 |
|---|---|
|
|
すべてのセッションのすべての高速収集データをラージ・プールからディスクにフラッシュします。 |
関連項目:
DBMS_MEMOPTIMIZE_ADMINパッケージについては、Oracle AI Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください
高速参照の使用
高速参照により、モノのインターネット(IoT)アプリケーションなどのアプリケーションでデータベース表からの高速データ取得が可能になります。
高速参照では、Memoptimizeプールと呼ばれるSGAバッファ領域に格納されているハッシュ索引を使用し、バッファ・キャッシュに永続的に固定されている表のブロックに高速にアクセスできるため、ディスクI/Oが回避され、問合せのパフォーマンスが向上します。
表の高速参照を使用するステップ
表の高速参照を使用するステップは、次のとおりです。
-
Memoptimizeプールの有効化
このタスクは、
MEMOPTIMIZE_POOL_SIZE初期化パラメータをゼロ以外の値に設定することによって実現されます。詳細は、Memoptimizeプールの有効化を参照してください。
-
表の高速参照の有効化
このタスクを実現するには、
CREATE TABLE文またはALTER TABLE文でMEMOPTIMIZE FOR READ句を指定します。詳細は、表の高速参照の有効化を参照してください。
ノート:
高速収集と高速参照の両方を使用するように表を構成できます。
関連項目:
-
memoptimizeプールのメモリー・アーキテクチャの詳細は、Oracle AI Database概要を参照してください
-
MEMOPTIMIZE_POOL_SIZE初期化パラメータの詳細は、Oracle AI Databaseリファレンスを参照してください
高速参照の前提条件
特定の特性やオブジェクト、パーティション化がある表では、高速参照はサポートされません。
高速参照の使用に関する制限事項を以下に示します。
-
高速参照が有効な表は圧縮できません。
-
高速参照が有効な表には主キー制約を有効にする必要があります。
-
次の特性を持つ表では高速READを使用できません:
- ディスク圧縮
- インメモリー圧縮
- ファンクション索引
- ドメイン索引
- ビットマップ索引
- ビットマップ結合索引
- ref型
- varray型
- OID$型
- 未使用列
- LOB
- LONG列
-
次のオブジェクトでは高速READを使用できません。
- 一時表
- ネストした表
- 索引構成表
- 外部表
- オンデマンド・リフレッシュがあるマテリアライズド・ビュー
- サブパーティション化はサポートされていません。
- AQ表
Memoptimizeプールの有効化
高速参照を使用する前に、Memoptimizeプールを有効にする必要があります。MemoptimizeプールはSGAに存在し、高速参照が有効にされた表のデータとハッシュ索引を格納します。
前提条件
このタスクは、COMPATIBLE初期化パラメータが18.0.0以上に設定されていることを想定しています。
Memoptimizeプールを有効にするには:
-
SQL*Plusで、管理権限を持つユーザーとしてデータベースにログインします。
-
MEMOPTIMIZE_POOL_SIZE初期化パラメータをゼロ以外の値に設定します。最小設定は100 MBです。ALTER SYSTEM文を使用してサーバー・パラメータ・ファイル(SPFILE)でこの初期化パラメータを設定する場合、SCOPE=SPFILEを指定する必要があります。たとえば、次の文では、Memoptimizeプールのサイズを10 GBに設定します。
ALTER SYSTEM SET MEMOPTIMIZE_POOL_SIZE = 10G SCOPE=SPFILE; -
データベースを再起動して、変更を有効にします。
例: 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です。
関連項目:
-
memoptimizeプールのメモリー・アーキテクチャの詳細は、Oracle AI Database概要を参照してください
-
MEMOPTIMIZE_POOL_SIZE初期化パラメータの詳細は、Oracle AI Databaseリファレンスを参照してください
表の高速参照の有効化
表の高速参照を有効にするには、CREATE TABLE文またはALTER TABLE文にMEMOPTIMIZE FOR READ句を指定します。
前提条件
このタスクはMemoptimizeプールが有効であることを前提としています。
表の高速参照を有効にするには:
-
SQL*Plusで、
ALTER TABLE権限を持つユーザーとしてデータベースにログインします。 -
高速参照を有効にする必要がある表に対して、
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句を指定します。
前提条件
このタスクでは、表で高速参照がすでに有効にされていることを前提としています。
表の高速参照を無効にするには:
-
SQL*Plusで、
ALTER TABLE権限を持つユーザーとしてデータベースにログインします。 -
高速参照を無効にする必要がある表に対して、
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パッケージのサブプログラムを次に示します。
| サブプログラム | 説明 |
|---|---|
|
|
Memoptimizeプールから表の高速参照データを削除します。 |
|
|
Memoptimizeプールに表の高速参照データを移入します。 |
関連項目:
-
DBMS_MEMOPTIMIZEパッケージについては、Oracle AI Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください -
memoptimizeプールのメモリー・アーキテクチャの詳細は、Oracle AI Database概要を参照してください
