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

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

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

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

自動共有メモリー管理を使用すると、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管理者ガイド』を参照してください

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

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

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

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

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

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

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

12.1.2 SGA_TARGETパラメータの設定

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

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

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

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

  • STATISTICS_LEVELTYPICALまたはALL

  • SGA_TARGETをゼロ以外の値に

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

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

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

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

12.2 手動による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開発者ガイド』を参照してください

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

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

12.2.1 SGAのサイズ設定単位

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

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

12.2.2 SGAの最大サイズ

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

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

注意:

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

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

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

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

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

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

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

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

関連項目:

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

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

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

関連項目:

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

12.2.4.1 ページングの削減

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

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

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

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

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

12.2.4.2.1 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
12.2.4.2.2 物理メモリーへのSGAのロック

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

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

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

12.2.5 構成の繰返し

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

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

12.3 共有メモリー管理の監視

表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リファレンス』を参照してください。

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

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

注意:

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

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

関連項目:

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

12.5 Memoptimizeされた行ストアによる問合せパフォーマンスの向上

Memoptimizeされた行ストアにより、主キー値に基づいて表を頻繁に問い合せるInternet of Things (IoT)アプリケーションなどのアプリケーションのデータ問合せパフォーマンスが向上します。

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

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

Memoptimizeされた行ストアでは、主に主キー値に基づいて問合せが実行される表のデータの高速参照機能が提供されます。

高速参照が有効になっていると、表のハッシュ索引が格納されるMemoptimizeプールと呼ばれるシステム・グローバル領域(SGA)内のメモリー領域が、Memoptimizeされた行ストアで使用されます。MEMOPTIMIZE_POOL_SIZE初期化パラメータは、Memoptimizeプールのサイズを制御します。

CREATE TABLEまたはALTER TABLE文にMEMOPTIMIZE FOR READ句を含めると、表の高速参照が有効になります。

ディスクI/Oを回避するためにバッファ・キャッシュに永続的に固定された特定の表のブロックに対する高速アクセスを実現するMemoptimizeプールのハッシュ索引構造によって、高速参照が有効になります。Memoptimizeされた行ストアを構成すると、このハッシュ索引が作成されてOracle Databaseによって自動的に保守されます。表の高速参照を有効にすると、表のブロックがバッファ・キャッシュに固定されてMemoptimizeプール内のハッシュ索引が表の問合せに使用されるためにパフォーマンスが向上します。

高速参照に関する考慮事項を以下に示します。

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

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

注意:

Memoptimizeされた行ストア機能は、Oracle Database 18c以降で使用可能です。

関連項目:

12.5.2 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です。

関連項目:

12.5.3 高速参照の使用

Memoptimizeされた行ストアの高速参照機能により、主キー列に基づく問合せのパフォーマンスが向上します。

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

12.5.3.1 表の高速参照の有効化

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

前提条件

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

表の高速参照を有効にするには、次のようにします。

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

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

例12-1 新しい表の高速参照の有効化

次の例では、test_flookup表が作成されて、高速参照が有効になります。

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

例12-2 既存の表の高速参照の有効化

次の例では、sh.sales表の高速参照が有効になります。

 ALTER TABLE sh.sales MEMOPTIMIZE FOR READ;
12.5.3.2 Memoptimizeプールの表の移入

Memoptimizeプールの表を移入するには、DBMS_MEMOPTIMIZE.POPULATEプロシージャを実行します。

前提条件

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

  • Memoptimizeプールが有効であること。

  • Memoptimizeプールに移入される表で高速参照が有効であること。

Memoptimizeプールの表に移入するには、次のようにします。

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

  2. DBMS_MEMOPTIMIZE.POPULATEプロシージャを実行して、Memoptimizeプールに移入する表を指定します。

例12-3 Memoptimizeプールの表の移入

次の例では、Memoptimizeプールのoe.orders表を移入しています。

execute DBMS_MEMOPTIMIZE.POPULATE('OE','ORDERS'); 
12.5.3.3 表の高速参照の無効化

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

表の高速参照を無効にするには、次のようにします。

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

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

例12-4 既存の表の高速参照の無効化

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

 ALTER TABLE sh.sales NO MEMOPTIMIZE FOR READ;