プライマリ・コンテンツに移動
Oracle® Databaseパフォーマンス・チューニング・ガイド
12cリリース1 (12.1)
B71276-05
目次へ移動
目次
索引へ移動
索引

前
次

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でのSGA_TARGETパラメータの設定

メモリー・パラメータSGAページからSGAサイズ・アドバイザにアクセスすることにより、Oracle Enterprise Managerで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コンポーネントのサイズ設定」の説明に従い、各メモリー・プールのサイズを手動で再設定できます。

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

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

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

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

  • 共有プール

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

  • ラージ・プール

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

  • Javaプール

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

  • Streamsプール

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

  • インメモリー列ストア

    インメモリー列ストアはオプションの静的SGAプールです。これは、インメモリー列ストアのサイズ設定の説明どおり、INMEMORY_SIZE初期化パラメータを使用してサイズ設定されます。

これらのパラメータの値は、ALTER SYSTEM文を使用して動的に構成することも可能ですが、INMEMORY_SIZEパラメータの値は例外です。INMEMORY_SIZEパラメータは静的パラメータです。したがって、ALTER SYSTEM文を使用してサイズを変更した後、変更を有効にするためにデータベース・インスタンスを再起動する必要があります。

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

関連項目:

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

  • STREAMS_POOL_SIZE初期化パラメータの詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください

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とその各内部構造に割り当てられているメモリー量を確認するには、例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
物理メモリーへの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リファレンス』を参照してください。

インメモリー列ストアの構成

インメモリー列ストアは任意の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初期化パラメータを使用してそのサイズを設定できます。

インメモリー列ストアのサイズを設定する手順:

  • 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;