12 システム・グローバル領域のチューニング
この章では、システム・グローバル領域(SGA)のチューニング方法を説明します。自動メモリー管理を使用してシステムのデータベース・メモリーを管理している場合は、この章で説明されているように、SGAのチューニングは必要ありません。
この章のトピックは、次のとおりです:
12.1 自動共有メモリー管理の使用
自動共有メモリー管理を使用すると、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概要』を参照してください
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.2 SGA_TARGETパラメータの設定
この項では、SGA_TARGET
パラメータの値を設定して、自動共有メモリー管理を有効化および無効化する方法を説明します。
この項では、次の項目について説明します。
12.1.2.1 自動共有メモリー管理の有効化
自動共有メモリー管理を有効化するには、次の初期化パラメータを設定します。
-
STATISTICS_LEVEL
をTYPICAL
または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プール
-
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.5 構成の繰返し
メモリーの割当てを構成する場合は、アプリケーションの必要性により異なりますが、Oracle Databaseメモリー構造に使用可能なメモリーを配分します。Oracle Databaseの構造にメモリーを配分すると、Oracle Databaseが正常に動作するために必要な物理I/O量に影響を与える可能性があります。最初にメモリーを適切に構成しておくと、I/Oシステムが効果的に構成されているかどうかがわかります。
メモリー構成プロセスをひととおり実行した後で、メモリー割当てのステップを繰り返すことが必要となる可能性もあります。実行を繰り返すことによって、後のステップの変更に基づいて前のステップの調整が可能となります。たとえば、バッファ・キャッシュのサイズを小さくすると、共有プールなど別のメモリー構造のサイズを大きくできます。
12.3 共有メモリー管理の監視
表12-1に、SGAのサイズ変更操作に関する情報が表示されるビューを示します。
表12-1 共有メモリー管理ビュー
ビュー | 説明 |
---|---|
|
現在進行中のSGAのサイズ変更操作に関する情報が表示されます。 |
|
最後に完了した800件のSGAのサイズ変更操作に関する情報が表示されます。これには現在進行中の操作は含まれません。 |
|
SGAの動的コンポーネントに関する情報が表示されます。このビューでは、インスタンスの起動後に発生したすべての実行済SGAサイズ変更操作に関する情報が要約されます。 |
|
将来の動的な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以降で使用可能です。
関連項目:
-
Memoptimizeプールのメモリー・アーキテクチャの詳細は、Oracle Database概要を参照してください
-
MEMOPTIMIZE_POOL_SIZE
初期化パラメータの詳細は、Oracle Databaseリファレンスを参照してください -
InfiniBand高速ネットワークのExadirectの構成の詳細は、Oracle Database Net Services管理者ガイドを参照してください
12.5.2 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リファレンスを参照してください
12.5.3 高速参照の使用
Memoptimizeされた行ストアの高速参照機能により、主キー列に基づく問合せのパフォーマンスが向上します。
この項では、次の項目について説明します。
12.5.3.1 表の高速参照の有効化
表の高速参照を有効にするには、CREATE TABLE
またはALTER TABLE
文にMEMOPTIMIZE FOR READ
句を含めます。
前提条件
このタスクはMemoptimizeプールが有効であることを前提としています。
表の高速参照を有効にするには、次のようにします。
-
SQL*Plusで、
ALTER TABLE
権限を持つユーザーとしてデータベースにログインします。 -
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プールの表に移入するには、次のようにします。
-
SQL*Plusで、管理ユーザーとしてデータベースにログインします。
-
DBMS_MEMOPTIMIZE.POPULATE
プロシージャを実行して、Memoptimizeプールに移入する表を指定します。
例12-3 Memoptimizeプールの表の移入
次の例では、Memoptimizeプールのoe.orders
表を移入しています。
execute DBMS_MEMOPTIMIZE.POPULATE('OE','ORDERS');
関連項目:
-
DBMS_MEMOPTIMIZE
パッケージの詳細は、Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンスを参照してください
12.5.3.3 表の高速参照の無効化
表の高速参照を無効にするには、ALTER TABLE
文にNO MEMOPTIMIZE FOR READ
句を含めます。
表の高速参照を無効にするには、次のようにします。
-
SQL*Plusで、
ALTER TABLE
権限を持つユーザーとしてデータベースにログインします。 -
NO MEMOPTIMIZE FOR READ
句を指定したALTER TABLE
文を実行します。
例12-4 既存の表の高速参照の無効化
次の例では、sh.sales
表の高速参照を無効にしています。
ALTER TABLE sh.sales NO MEMOPTIMIZE FOR READ;
関連項目: