この章では、システム・グローバル領域(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の管理の詳細は、『Oracle Database管理者ガイド』を参照してください
初期化パラメータの使用方法の詳細は、『Oracle Database管理者ガイド』を参照してください
この項では、SGA_TARGET
パラメータの値を設定するためのユーザー・インタフェースについて説明します。
この項の内容は次のとおりです。
メモリー・パラメータSGAページからSGAサイズ・アドバイザにアクセスすることにより、Oracle Enterprise ManagerでSGA_TARGET
パラメータの値を変更できます。
この項では、SGA_TARGET
パラメータの値を設定して、自動共有メモリー管理を有効化および無効化する方法を説明します。
この項の内容は次のとおりです。
自動共有メモリー管理を有効化するには、次の初期化パラメータを設定します。
STATISTICS_LEVEL
をTYPICAL
またはALL
に
SGA_TARGET
をゼロ以外の値に
SGA_TARGET
パラメータは、SGA_MAX_SIZE
初期化パラメータの値以下に設定できます。SGA_TARGET
パラメータの値は、SGA専用にするメモリーの容量に設定します。
自動共有メモリー管理を無効化するには、インスタンスの起動時にSGA_TARGET
パラメータの値を動的に0に設定します。
これにより、自動共有メモリー管理が無効化され、現在の自動チューニングされたサイズが各メモリー・プールに使用されます。必要な場合は、「手動によるSGAコンポーネントのサイズ設定」の説明に従い、各メモリー・プールのサイズを手動で再設定できます。
システムで自動メモリー管理または自動共有メモリー管理が使用されていない場合は、次のSGAコンポーネントのサイズを手動で構成する必要があります。
データベース・バッファ・キャッシュ
データベース・バッファ・キャッシュは、「データベース・バッファ・キャッシュの構成」で説明されているように、DB_CACHE_SIZE
初期化パラメータを使用してサイズ設定されます。
共有プール
共有プールは、「共有プールの構成」で説明されているように、SHARED_POOL_SIZE
初期化パラメータを使用してサイズ設定されます。
ラージ・プール
ラージ・プールは、「ラージ・プールの構成」で説明されているように、LARGE_POOL_SIZE
初期化パラメータを使用してサイズ設定されます。
Javaプール
Javaプールは、JAVA_POOL_SIZE
初期化パラメータを使用してサイズ設定されます。
Streamsプール
インメモリー列ストア
インメモリー列ストアはオプションの静的SGAプールです。これは、「インメモリー列ストアのサイズ設定」の説明どおり、INMEMORY_SIZE初期化パラメータを使用してサイズ設定されます。
これらのパラメータの値は、ALTER
SYSTEM
文を使用して動的に構成することも可能ですが、INMEMORY_SIZEパラメータの値は例外です。INMEMORY_SIZEパラメータは静的パラメータです。したがって、ALTER
SYSTEM
文を使用してサイズを変更した後、変更を有効にするためにデータベース・インスタンスを再起動する必要があります。
これらのSGAコンポーネントのサイズを構成する前に、次の内容を考慮してください。
関連項目:
Javaのメモリー使用量およびJAVA_POOL_SIZE
初期化パラメータの詳細は、『Oracle Database Java開発者ガイド』を参照してください
STREAMS_POOL_SIZE
初期化パラメータの詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください
バッファ・キャッシュ、共有プール、ラージ・プールおよびJavaプールのメモリーは、グラニュル単位で割り当てられます。SGAのサイズが1GBより少ない場合、グラニュル・サイズは4MBです。SGAサイズが1GBを超えている場合、グラニュル・サイズは16MBに変化します。グラニュル・サイズは、データベース・インスタンスの起動時に計算されて固定されます。このサイズは、インスタンスの存続期間中は変化しません。
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 Databaseメモリー構造にメモリーを割り当ててください。
既存のアプリケーションに変更または追加を行う場合は、変更されたアプリケーションの必要性に対応するようOracle Databaseのメモリー構造のサイズを変更してください。
アプリケーションがJavaを使用する場合、Javaプールのデフォルト構成を変更する必要があるかどうかを調べてください。
関連項目:
Javaのメモリー使用量の詳細は、『Oracle Database Java開発者ガイド』を参照してください。
大半のオペレーティング・システムでは、メモリーを構成する際に次のことを考慮することが重要です。
関連項目:
オペレーティング・システムのメモリー使用方法のチューニングの詳細は、オペレーティング・システムのハードウェアとソフトウェアのマニュアル、およびオペレーティング・システム固有のOracleマニュアルを参照してください。
ページングは、新しいページをメモリーにロードするため、オペレーティング・システムがメモリー常駐ページをディスクに転送する場合に行われます。多くのオペレーティング・システムは、実メモリーに格納しきれない大量の情報を収容するために、ページングを行います。大半のオペレーティング・システムでは、ページングはパフォーマンスを低下させます。
ホスト・システムで大量のページングが発生しているかどうかを判断するには、オペレーティング・システムのユーティリティを使用して、オペレーティング・システムを調べます。大量のページングが発生している場合は、メモリーが割り当てられているメモリー・キャッシュを保持できるほど、合計システム・メモリーが大きくない可能性があります。システムの総メモリー量を増加するか、割り当てられているメモリー量を低減することを検討してください。
SGAの目的は、迅速なアクセスのためにメモリー内にデータを格納することであるため、SGAはメイン・メモリー内に存在する必要があります。SGAのページがディスクにスワップされると、データに迅速にアクセスできなくなります。多くのオペレーティング・システムでは、ページングによる損失は、大規模なSGAがもたらす利益をかなり上回ります。
この項の内容は次のとおりです。
SGAとその各内部構造に割り当てられているメモリー量を確認するには、例12-1に示すように、SQL*PlusでSHOW SGA
文を使用します。
例12-1 SGAメモリー割当ての表示
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リファレンス』を参照してください。
インメモリー列ストアは任意のSGA領域です。ここには、迅速にスキャンできるように最適化された列形式で、表のコピー、パーティションおよびその他のデータベース・オブジェクトが格納されています。
この項の内容は次のとおりです。
注意:
インメモリー列ストアは、Oracle Database 12cリリース1 (12.1.0.2)以上で使用可能です。
インメモリー列ストアは、表のコピー、パーティションおよびその他のデータベース・オブジェクトをSGAに格納します。インメモリー列ストアはデータベース・バッファ・キャッシュに代わるものではありません。むしろ、お互いを補い合うことで、両方のメモリー領域が同じデータを別の形式で保管できます。インメモリー列ストアに保管された行は、列形式で大きなメモリー領域に分割されます。各領域内で、列はメモリーの連続的なエリア内で別々に存在します。
インメモリー列ストアは、次のいずれかのデータベース・オブジェクトで有効にできます。
表
マテリアライズド・ビュー
パーティション
表領域
インメモリー列ストアの表のすべての列またはマテリアライズド・ビューを格納することを選択するか、その列のサブセットのみを選択できます。同様に、パーティション化された表について、インメモリー列ストアの表のパーティションのすべてを格納することを選択するか、パーティションのサブセットのみを選択できます。インメモリー列ストアを表領域レベルで有効にすると、表領域内のすべての表およびマテリアライズド・ビューがインメモリー列ストアに対して自動的に有効になります。
関連項目:
『Oracle Database概要』
『Oracle Database管理者ガイド』
データベース・オブジェクトをメモリー内に格納することで、Oracle Databaseはスキャン、問合せ、結合および集計を、ディスク上よりもはるかに速く実行できます。インメモリー列ストアは、次の場合にパフォーマンスを劇的に改善できます。
大量の行のスキャンと、フィルタ(<
、>
、=
、IN
など)の適用。
100列ある表から5列を選択する場合などの、大量の列からの小さな列サブセットの問合せ。
特に結合条件がほとんどの行をフィルタリングする場合の、小さな表の大きな表への結合。
問合せのデータの集計。
インメモリー列ストアはデータ操作言語(DML)文のパフォーマンスも改善します。オンライン・トランザクション処理(OLTP)システムでは通常、一般的にアクセスされる列で多数の索引が作成されることが必要です。この索引はDML文のパフォーマンスにマイナスの影響を及ぼす場合があります。データベース・オブジェクトがインメモリー列ストアに格納されると、この索引は削減または排除できます。これはスキャンの実行速度が上がるためです。索引数の削減によって、更新を必要とする索引の数が減るため、DML文のパフォーマンスが向上します。
関連項目:
インメモリー列ストアの利点の詳細は、『Oracle Database概要』を参照してください
インメモリー列ストアの使用には大量のメモリーが必要です。メモリー要件を軽減するため、インメモリー列ストアでは格納するデータをユーザーが圧縮できます。問合せはその後、圧縮されたデータ上で直接実行されます。インメモリー列ストアに格納されるデータベース・オブジェクトのそれぞれについて、圧縮方法を指定できます。したがって、インメモリー列ストアで必要なメモリー量は、格納するデータベース・オブジェクトと個々の圧縮方法によって異なります。
一方では、高圧縮方法の選択によってインメモリー列ストアで必要なメモリー量が削減されますが、パフォーマンスの成果は最大ではありません。他方では、低圧縮方法の選択によって最大のパフォーマンスの成果が提供されますが、必要なメモリー量も増加します。インメモリー列ストアに格納するデータベース・オブジェクトの圧縮方法の選択では、目標とするパフォーマンスの成果と使用できるメモリー量のバランスを取ります。
インメモリー列ストアでは次の圧縮方法がサポートされています。
NO MEMCOMPRESS
この圧縮方法はデータを圧縮しません。
MEMCOMPRESS FOR DML
この圧縮方法はDML操作のデータを最適化して、インメモリー列ストアのデータを最小に圧縮します。
MEMCOMPRESS FOR QUERY LOW
この圧縮方法による結果は最適な問合せパフォーマンスです。この方法はインメモリー列ストアのデータを、MEMCOMPRESS FOR DML
を上回り、MEMCOMPRESS FOR QUERY HIGH
を下回るように圧縮します。
MEMCOMPRESS FOR QUERY HIGH
この圧縮方法による結果は優れた問合せパフォーマンスです。この方法はインメモリー列ストアのデータを、MEMCOMPRESS FOR QUERY LOW
を上回り、MEMCOMPRESS FOR CAPACITY LOW
を下回るように圧縮します。
MEMCOMPRESS FOR CAPACITY LOW
この圧縮方法による結果は良好な問合せパフォーマンスです。この方法はインメモリー列ストアのデータを、MEMCOMPRESS FOR QUERY HIGH
を上回り、MEMCOMPRESS FOR CAPACITY HIGH
を下回るように圧縮します。
MEMCOMPRESS FOR CAPACITY HIGH
この圧縮方法による結果は中程度の問合せパフォーマンスです。この圧縮方法はインメモリー列ストアのデータを最大に圧縮します。
関連項目:
インメモリー圧縮方法の詳細は、『Oracle Database管理者ガイド』を参照してください
圧縮アドバイザを使用した圧縮率の見積もり方法の詳細は、『Oracle Database管理者ガイド』を参照してください
各データベース・オブジェクトの格納に必要なメモリー量を一度見積もると、インメモリー列ストアで必要な合計メモリー量を、格納対象のすべてのデータベース・オブジェクトで必要なメモリー量の大体の合計として計算できます。また、データベース・オブジェクトの成長に対応し、DML操作後に行の更新バージョンを格納するための、追加的な領域も含める必要があります。
例12-2は、インメモリー列ストアのoe.product_information
表を有効化し、圧縮方法MEMCOMPRESS FOR CAPACITY HIGH
を指定する例を示しています。
例12-2 MEMCOMPRESS FOR CAPACITY HIGH圧縮によるインメモリー列ストアの表の有効化
ALTER TABLE oe.product_information INMEMORY MEMCOMPRESS FOR CAPACITY HIGH;
インメモリー列ストアのサイズを設定する手順:
INMEMORY_SIZE
初期化パラメータを必要なサイズに設定します。
このパラメータのデフォルト値は0
で、これはインメモリー列ストアが使用されていないことを意味します。インメモリー列ストアを有効にするには、このパラメータを0以外の値に設定します。
マルチテナント環境では、各PDBのインメモリー列ストアのサイズを指定するために、このパラメータをプラガブル・データベース(PDB)ごとに設定できます。PDB値の合計は、コンテナ・データベース(CDB)の値と等しくなる必要はなく、その値を上回る場合もあります。
インメモリー列ストアのサイズを設定した後、データベース・インスタンスを再起動して、その中に格納されるデータベース・オブジェクトを有効にする必要があります。
関連項目:
インメモリー列ストアのデータベース・オブジェクトの有効化の詳細は、『Oracle Database管理者ガイド』を参照してください
INMEMORY_SIZE
初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください
例12-3は、インメモリー列ストアのサイズを100GBに設定する例を示しています。
例12-3 インメモリー列ストアのサイズの設定
ALTER SYSTEM SET INMEMORY_SIZE = 100G;