データベースの稼働状況を診断共有するサイト パフォーマンスセラピー
Statspackとは Statspack設定 statspackでの情報収集 statspackレポートの出力 便利スクリプト Oracleチューニング講座


                                  
第21章 自動共有メモリー管理とは
第9章「Oracleメモリー構造とプロセスについて復習する」で説明した、システム・グローバル領域(SGA)を自動的にチューニングしてくれるという、自動共有メモリー管理機能がOracle10gより追加されています。
自動共有メモリー管理機能を使用することにより、メモリー管理が容易になります。
本章では、この機能について説明します。

概要
第10章から第18章までで記述したような、共有プールやデータベース・バッファ・キャッシュなどのSGAコンポーネントをそれぞれ手動で設定するというチューニング方法は、データベース管理者にとって大きな負荷になると考えられます。
そこでOracle10gからは、これらの管理を大幅に簡素化することができる、自動共有メモリー管理機能が追加されました。

この機能はデータベース管理者が、SGAのいくつかのコンポーネント(shared_pool、buffer_cache、large_pool、java_poolなど)に対して個々にサイズ設定する必要がなく、その代わりとして初期化パラメータsga_targetでSGAの合計サイズのみを指定するだけで、Oracle Databaseのメモリー使用率が最も効率的になるように様々なコンポーネントに自動的に分配してくれます。
sga_target>0(かつstatistics_level = typical or all)の場合、sga_targetで指定されたサイズが全てのSGAコンポーネントの合計サイズとなります。
しかし、初期化パラメータsga_targetを0に設定した場合は自動共有メモリー管理機能が無効となりますので、その場合は今まで通り各コンポートネントのサイズを個別に指定するという方法で、SGAの合計サイズを決定する事になりますのでご注意ください。

自動共有メモリー機能により自動調整されるコンポーネントはSGAを構成するコンポーネントのうちの以下です。
インスタンスの内部ビューと統計情報から、以下のコンポーネントに割り当てる適切なメモリーサイズを決定し、変化に応じて再分配も行います。

・共有プール
・データベース・バッファ・キャッシュ
・ラージ・プール
・Javaプール
・ストリームス・プール (初期化パラメータ:STREAMS_POOL_SIZE)
※OracleR10.2リリース以降

以下のコンポーネントは、自動で管理されませんので、引き続き初期化パラメータを設定してください。
・REDOログ・バッファ
・KEEP/RECYCLEバッファ・非標準ブロック用のバッファ
・ストリーム・プール((初期化パラメータ:STREAMS_POOL_SIZE)※OracleR10.1のみ

以下に図で説明します。
図1:SGA内の自動調整されるコンポーネント



自動共有メモリー機能を有効とした場合、具体的には以下のような場合に各コンポーネントの自動調整が行われます。
■使用可能なメモリー領域が不足していてエラーが発生してしまうような場合。
 動的に調整されることによりORA-4031(共有プールの領域不足)の発生を回避できる可能性が高くなりま
 す。しかし、SGA_TARGETパラメータの範囲で領域を拡大しても足りないような場合は、やはりORA-4031
 が発生するので注意が必要です。
■内部チューニング・アルゴリズムによってワークロードのパフォーマンスが監視され、サイズを調整したほうが
 良いと判断されたとき。

サイズ変更の動作
メモリー不足となった領域に対するメモリーを供給元は、データベース・バッファ・キャッシュからのみです。
他のコンポーネントの領域が縮小・移動されることはありません。また、データベース・バッファ・キャッシュのサイズが増加することもありません。
この動作の理由としては、データベース・バッファ・キャッシュはサイズが不足したような場合、待機が発生することはあってもエラーになることが無いからです。それに対して、その他の領域はサイズ不足のエラーが発生する可能性があので、データベース・バッファ・キャッシュからメモリーが提供される仕組みになっています。
よって、SGA_TARGETパラメータの値を動的に大きな値に変更した場合は、増加分はまずデータベース・バッファ・キャッシュに必ず割当てられます。

ただし、他のコンポーネントの負荷が下がったと判断されれば、バッファキャッシュにメモリを戻すという動作は行われています。
NOTE 自動共有メモリー管理機能は、新しいバックグラウンド・プロセスであるMMAN(メモリー・マネージャ)プロセスを使用します。MMANプロセスは統計を定期的に収集し、各コンポーネントが必要とするサイズを状況に応じて調整します。

自動共有メモリー管理の設定
SGA合計サイズは、SGA_TARGETパラメータで設定します。このパラメータの値を0より大きな値に設定した場合、自動共有メモリー管理機能が使用されます。
SGA_TARGETパラメータ
概要 すべてのSGAコンポーネントの合計サイズを設定      
構文 SGA_TARGET = n [ K | M | G ]
デフォルト 0 (自動共有メモリー管理は無効の状態)
最小値 64以上
変更の可/不可 可/ALTER SYSTEM
SGA_TARGETで設定するサイズは、自動管理されないREDOログ・バッファや、インスタンスで必要とする固定SGA領域などを全て含んだSGAの合計サイズです。そのため、これらの領域サイズをSGA_TARGETから引いた残りの領域が自動共有メモリーとして使用されることになります。

また、関連パラメータとして初期化パラメータSGA_MAX_SIZEがあります。
このパラメータには動的に変更できるSGA_TARGETパラメータの最大サイズを設定します。
ただし、起動時にSGA_TARGETの値がSGA_MAX_SIZEの値を超えていた場合は、SGA_TARGETの値がSGA_MAX_SIZEに上書きされます。

また、自動共有メモリー管理を使用している際、以下のパラメータは無効となるわけではなく各コンポーネントの最小サイズになります。
・共有プール(SHARED_POOL_SIZE)
・データベース・バッファ・キャッシュ(DB_CACHE_SIZE)
・ラージ・プール(LARGE_POOL_SIZE)
・Javaプール(JAVA_POOL_SIZE)


NOTE SPFILEを使用している場合、インスタンスを停止してもその時点の各コンポーネントサイズは保持され、次回起動時に継承されます。
この実装は以下の(アンダースコアが2つ付く)パラメータで制御しています:
__db_cache_size
__shared_pool_size
__large_pool_size
__java_pool_size
各コンポーネントサイズが大きくなる毎にこのパラメータが更新され、今までの最大サイズがこのパラメータに設定されます。DB再起動時に共有プール、ラージプール、JAVAプールに関してはこのパラメータの値を採用して起動時に領域を割り当てます(残りをバッファ・キャッシュに割り当てます)。

自動共有メモリーに関する情報を示すビュー
以下に自動共有メモリー管理を使用している際に確認できるビューを記します。
現在のSGAコンポーネントの割当てを確認したい場合などに確認するビューです。
ビュー名 説明
V$SGA_CURRENT_RESIZE_OPS 現在進行中のSGAサイズ変更に関する情報。
V$SGA_DYNAMIC_COMPONENTS インスタンス起動後のすべてのSGAサイズ変更に関する情報。
V$SGA_DYNAMIC_FREE_MEMORY 将来の動的SGAサイズ変更に使用可能なSGAメモリーの量に関する情報。
V$SGA_RESIZE_OPS これまでに完了した400回のSGAサイズ変更操作に関する情報。
V$SGAINFO GAのサイズ情報を示す。

以下に自動メモリー管理を使用した際の確認例を記します。OracleR10.1でのテスト例です。
例:自動共有メモリー管理を使用する
/* SGA_TARGETパラメータを120MBで設定 */
SQL> SHOW PARAMETER sga_target

NAME TYPE VALUE
---------- ---------- -----------------
sga_target big integer 120M


/* 現在のSGAコンポーネントの割当てを確認 */
SQL> SELECT * FROM v$sgainfo;

NAME TYPE VALUE
------------------------ ---------- -----------------
Fixed SGA Size 777736 No
Redo Buffers 262144 No
Buffer Cache Size 62914560 Yes
Shared Pool Size 46137344 Yes
Large Pool Size 4194304 Yes
Java Pool Size 8388608 Yes
Streams Pool Size 0 Yes
Granule Size 4194304 No
Maximum SGA Size 125829120 No
Startup overhead in Shared Pool 33554432 No
Free SGA Memory Available 0


/* しばらくして再確認 */
SQL> SELECT * FROM v$sgainfo;

NAME TYPE VALUE
------------------------ ---------- -----------------
Fixed SGA Size 777736 No
Redo Buffers 262144 No
Buffer Cache Size 58720256 Yes
Shared Pool Size 50331648 Yes ←バッファ・キャッシュ
 の4Mが共有プール
 に移行されている
Large Pool Size 4194304 Yes
Java Pool Size 8388608 Yes
Streams Pool Size 0 Yes
Granule Size 4194304 No
Maximum SGA Size 125829120 No
Startup overhead in Shared Pool 33554432 No
Free SGA Memory Available 0


また、各コンポーネントのサイズは、_SHARED_POOL_SIZE、_DB_CACHE_SIZE、
_LARGE_POOL_SIZE、_JAVA_POOL_SIZEに設定されている値で確認できます。

NOTE SGA_TARGETを0にして自動共有メモリー管理を無効化した場合、SHARED_POOL_SIZEパラメータなどには、現在のサイズが自動的に設定されます。




以上で共有メモリー管理についての説明はこれで終了です。
メモリー管理の作業負荷軽減およびメモリ使用の効率化のためにご利用いただければと思います。
第22章では、データ・ブロックのサイズによるパフォーマンスへの影響について説明します。
               
            第22章 データ・ブロックのサイズによるパフォーマンスへの影響を知る