12 システム・グローバル領域のチューニング
この章では、システム・グローバル領域(SGA)のチューニング方法を説明します。自動メモリー管理を使用してシステムのデータベース・メモリーを管理している場合は、この章で説明されているように、SGAのチューニングは必要ありません。
この章のトピックは、次のとおりです:
自動共有メモリー管理の使用
自動共有メモリー管理を使用すると、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のサイズ設定単位
バッファ・キャッシュ、共有プール、ラージ・プールおよび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
構成での繰返し
メモリーの割当てを構成する場合は、アプリケーションの必要性により異なりますが、Oracle Databaseメモリー構造に使用可能なメモリーを配分します。Oracle Databaseの構造にメモリーを配分すると、Oracle Databaseが正常に動作するために必要な物理I/O量に影響を与える可能性があります。最初にメモリーを適切に構成しておくと、I/Oシステムが効果的に構成されているかどうかがわかります。
メモリー構成プロセスをひととおり実行した後で、メモリー割当てのステップを繰り返すことが必要となる可能性もあります。実行を繰り返すことによって、後のステップの変更に基づいて前のステップの調整が可能となります。たとえば、バッファ・キャッシュのサイズを小さくすると、共有プールなど別のメモリー構造のサイズを大きくできます。
共有メモリー管理の監視
表12-1に、SGAのサイズ変更操作に関する情報が表示されるビューを示します。
表12-1 共有メモリー管理ビュー
ビュー | 説明 |
---|---|
|
現在進行中のSGAのサイズ変更操作に関する情報が表示されます。 |
|
最後に完了した800件のSGAのサイズ変更操作に関する情報が表示されます。これには現在進行中の操作は含まれません。 |
|
SGAの動的コンポーネントに関する情報が表示されます。このビューでは、インスタンスの起動後に発生したすべての実行済SGAサイズ変更操作に関する情報が要約されます。 |
|
将来の動的な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
として指定された表にデータを挿入します。データベースは、これらの挿入をラージ・プールに一時的にバッファリングし、これらのバッファリングされた挿入をディスクに書き込むときに変更を自動的にコミットします。この変更はロールバックできません。
高速収集を使用した挿入は、遅延挿入とも呼ばれます。これは、最初はラージ・プールにバッファリングされ、後でバックグラウンド・プロセスによって非同期にディスクに書き込まれるためです。
表にデータを挿入するために高速収集を使用するステップ
表にデータを挿入するために高速収集を使用するステップは、次のとおりです。
-
表で高速収集を有効にするには、
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 Databaseトランザクション処理とはまったく異なります。この機能では、データはログ記録され、データベースに一旦書き込まれると(つまり、コミットされると)失われることがありません。最大限の収集処理能力を実現するために、通常のOracleトランザクション・メカニズムは無視されます。すべてのデータが実際にデータベースに書き込まれているかどうかは、そのアプリケーションで確認する必要があります。データがデータベースに書き込まれたかどうかを確認するために呼び出すことができる、特別なAPIが追加されました。
高速収集のコンテキストの場合、commit
操作は意味を持ちません。これはOracleにおける従来の意味でのトランザクションではないためです。挿入をロールバックする機能はありません。高速収集バッファからディスクにフラッシュされるまで、データの問合せもできません。ビューV$MEMOPTIMIZE_WRITE_AREA
を問い合せることで、高速収集バッファに関する管理情報を確認できます。
また、パッケージDBMS_MEMOPTIMIZE
およびDBMS_MEMOPTIMIZE_ADMIN
を使用して、ラージ・プールから高速収集データをフラッシュする機能や、フラッシュされたデータの順序IDを決定する機能などを実行できます。
索引操作および制約チェックは、データがラージ・プール内の高速収集領域からディスクに書き込まれるときにのみ実行されます。バックグラウンド・プロセスでデータがディスクに書き込まれるときに主キー違反が発生した場合は、データベースによってこれらの行がデータベースに書き込まれることはありません。
すべてではありませんがほとんどのアプリケーションについては、挿入したすべてのデータをデータベースに書き込む必要があると仮定すると、アプリケーションの挿入プロセスで、挿入したデータが実際にデータベースに書き込まれたことを確認してからそのデータを破棄するようにすることが重要です。その確認が行われた場合のみ、挿入側プロセスからデータを削除できます。
関連項目:
-
遅延挿入メカニズムの詳細は、『Oracle Database概要』を参照してください
高速収集表の前提条件
特定の特性やオブジェクト、パーティション化がある表では、高速収集はサポートされません。
自律型データベースでアイテムがサポートされ、その制限がない場合はその旨が記載されています。
-
次の特性を持つ表では高速収集を使用できません。
- ディスク圧縮
- インメモリー圧縮
- ファンクション索引
- ドメイン索引
- ビットマップ索引
- ビットマップ結合索引
- ref型
- varray型
- OID$型
- 未使用列
- LOB
- トリガー
- バイナリ列
- 外部キー
- 行のアーカイブ
- 非表示列[自律型データベースは仮想列をサポートしています。]
-
次のオブジェクトでは高速収集を使用できません。
- 一時表
- ネストした表
- 索引構成表
- 外部表
- オンデマンド・リフレッシュがあるマテリアライズド・ビュー
- サブパーティション化はサポートされていません。[自律型データベースはサブパーティション化をサポートしています。]
-
次のパーティション化タイプはサポートされていません。
- REFERENCE
- SYSTEM
- INTERVAL [自律型データベースはこれをサポートしています。]
- AUTOLIST [自律型データベースはこれをサポートしています。]
高速収集に関するその他の考慮事項を次に示します。
-
すべてではありませんがほとんどのアプリケーションについては、挿入したすべてのデータをデータベースに書き込む必要があると仮定すると、アプリケーションの実装プロセスで、挿入したデータが実際にデータベースに書き込まれたことを確認してからそのデータを破棄するようにすることが重要です。その確認が行われた場合のみ、挿入側プロセスからデータを削除できます。
-
高速収集では、ラージ・プールにデータをバッファリングするため、システム障害の発生時にデータが失われる可能性があります。データの損失を回避するには、データがディスクに書き込まれる前にシステム障害が発生した場合に挿入を再現できるように、クライアントは挿入実行後にデータのローカル・コピーを保持する必要があります。クライアントは、
DBMS_MEMOPTIMIZE
パッケージのサブプログラムを使用して、挿入の永続性を追跡できます。挿入がディスクに書き込まれたら、クライアントは挿入されたデータのローカル・コピーを破棄できます。 -
問合せはラージ・プールからデータを読み取らないため、高速収集を使用して挿入されたデータはディスクに書き込まれるまで問合せできません。
-
索引操作は、通常の挿入と同様に高速収集によってサポートされます。ただし、高速収集の場合、データベースはデータをディスクに書き込むときに索引操作を実行し、ラージ・プールにデータを書き込むときには実行しません。
-
ラージ・プール内の高速収集バッファに割り当てられたサイズは、作成後は固定となります。バッファがいっぱいになると、バックグラウンド・プロセスでバッファが排出されるまで、それ以降の収集は待機状態になります。
ノート:
高速収集と高速参照の両方を使用するように表を構成できます。
表への高速収集の有効化
表で高速収集を有効にするには、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 Databaseリファレンス』を参照してください
DBMS_MEMOPTIMIZEパッケージのサブプログラムの概要
DBMS_MEMOPTIMIZE
パッケージの次のサブプログラムを使用して、ラージ・プールの高速収集データを表示および制御できます。
サブプログラム | 説明 |
---|---|
|
すべてのセッションでディスクに正常に書き込まれたデータ・レコードの低い最高水位標(低いHWM)の順序番号を返します。 |
|
現在のセッションでラージ・プールに書き込まれたデータ・レコードの最高水位標(HWM)の順序番号を返します。 |
|
現行セッションのすべての高速収集データをラージ・プールからディスクにフラッシュします。 |
関連項目:
DBMS_MEMOPTIMIZE
パッケージの詳細は、Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンスを参照してください
DBMS_MEMOPTIMIZE_ADMINパッケージのサブプログラムの概要
DBMS_MEMOPTIMIZE_ADMIN
パッケージの次のサブプログラムを使用して、ラージ・プールの高速収集データを制御できます。
サブプログラム | 説明 |
---|---|
|
すべてのセッションのすべての高速収集データをラージ・プールからディスクにフラッシュします。 |
関連項目:
DBMS_MEMOPTIMIZE_ADMIN
パッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください
高速参照の使用
高速参照により、モノのインターネット(IoT)アプリケーションなどのアプリケーションでデータベース表からの高速データ取得が可能になります。
高速参照では、Memoptimizeプールと呼ばれるSGAバッファ領域に格納されているハッシュ索引を使用し、バッファ・キャッシュに永続的に固定されている表のブロックに高速にアクセスできるため、ディスクI/Oが回避され、問合せのパフォーマンスが向上します。
表の高速参照を使用するステップ
表の高速参照を使用するステップは、次のとおりです。
-
Memoptimizeプールの有効化
このタスクは、
MEMOPTIMIZE_POOL_SIZE
初期化パラメータをゼロ以外の値に設定することによって実現されます。詳細は、Memoptimizeプールの有効化を参照してください。
-
表の高速参照の有効化
このタスクを実現するには、
CREATE TABLE
文またはALTER TABLE
文でMEMOPTIMIZE FOR READ
句を指定します。詳細は、表の高速参照の有効化を参照してください。
高速参照の使用に関する制限事項
高速参照の使用に関する制限事項を以下に示します。
-
高速参照が有効な表は圧縮できません。
-
高速参照が有効な表には主キー制約を有効にする必要があります。
ノート:
高速収集と高速参照の両方を使用するように表を構成できます。
関連項目:
-
Memoptimizeプールのメモリー・アーキテクチャの詳細は、Oracle Database概要を参照してください
-
MEMOPTIMIZE_POOL_SIZE
初期化パラメータの詳細は、Oracle Databaseリファレンスを参照してください
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 Database概要を参照してください
-
MEMOPTIMIZE_POOL_SIZE
初期化パラメータの詳細は、Oracle 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 Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンスを参照してください -
Memoptimizeプールのメモリー・アーキテクチャの詳細は、Oracle Database概要を参照してください