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


                                  
第12章 DBMS_SHARED_POOLパッケージを使ってしてみよう
本章では、第10章共有プールのチューニングを学ぶ(2) の(5)ライブラリ・キャッシュ・ミスの解消4(断片化解消)で紹介したDBMS_SHARED_POOLパッケージについて説明します。

第10章共有プールのチューニングを学ぶ(2) で説明したように、非常に大きいメモリーを必要とするPL/SQLが呼び出されたような場合、様々なオブジェクトの割当て・解放が繰返されるため、メモリ内で断片化が問題となる場合があります。
断片化解消の一つの方法として予約プールを共有プール内に用意する回避策を第11章予約プールについて理解し設定してみよう で説明しました。
その他の断片化解消方法として使用頻度の高いPL/SQLなど大きなメモリーを必要とするオブジェクトを、DBMS_SHARED_POOLパッケージを使用してライブラリ・キャッシュに固定する方法が挙げられます。この解消方法により、メモリーの断片化や大きなオブジェクトの再解析を防止する事で効率的なメモリーの割り当てが可能となりますので、是非参考にしていただければと思います。

オブジェクトの固定
メモリーが充分に確保されていないと、固定されていないその他のSQLやPL/SQLのライブラリ・キャッシュ・ミスが多く発生する可能性がある為、DBMS_SHARED_POOLパッケージを使ってオブジェクトをメモリー上に固定します。
以下にDBMS_SHARED_POOLパッケージの使用に関して説明します。

(1)DBMS_SHARED_POOLパッケージの使用
オブジェクトの固定にはDBMS_SHARED_POOLパッケージを使用します。固定したオブジェクトを外すプロシージャなども用意されています。
DBMS_SHARED_POOLパッケージは、$ORACLE_HOME/rdbms/admin/dbmspool.sqlで作成されますので、まず最初の準備として以下のファイルをSYSユーザで実行します。
ORACLE_HOME/rdbms/admin/dbmspool.sql

そして、DBMS_SHARED_POOL.KEEPを以下のように実行して、オブジェクトを共有メモリー内に維持します。これにより、LRUアルゴリズムによって除去されなくなります。
DBMS_SHARED_POOL.KEEP(name VARCHAR2,flag CHAR DEFAULT 'P')

パラメータに関しては以下になります。
・name オブジェクト名またはカーソルのアドレス
・flag
固定する任意の
P プロシージャ、ファンクション
Q 順序
R トリガー
任意の文字 カーソル
 
なお、データベースを停止するとフラッシュされますので再起動した場合は上記の処理を再実行してください。
以下のようなオブジェクトが固定する候補となります。
 ・大きなPL/SQLオブジェクト
 ・頻繁に使用されるトリガー
 ・順序(シーケンス)

指定してKEEPしたオブジェクトをメモリー上から除去する場合は、DBMS_SHARED_POOL.UNKEEPを以下のように実行します。
例えば、ある時間帯だけ使用頻度が高いオブジェクトがあり、それをKEEPし不要になったらUNKEEPする、というような」使い方もあります。
DBMS_SHARED_POOL.UNKEEP(name VARCHAR2,flag CHAR DEFAULT 'P')
※UNKEEPプロシージャの各パラメータは、KEEPと同じです。
以下に、DBMS_SHARED_POOL.KEEPを実行して、プロシージャを固定する実行例を記します。

例)ライブラリ・キャッシュにあるプロシージャを調査し、LOADされた回数を調べ必要に応じてプロシージャを固定する
/* サイズが大きいプロシージャを検索 */
SQL> SELECT owner,name,sharable_mem,loads,kept
2 FROM v$db_object_cache
3 WHERE type IN ('PROCEDURE')
4 ORDER BY loads desc;

OWNER NAME SHARABLE_MEM LOADS KEP
--------- -------- ------------------- ------- ------
SCOTT PRO2 442926  9 NO
SCOTT PRO1   8726  7 NO

/* PRO2プロシージャをライブラリ・キャッシュに固定 */
SQL> EXECUTE DBMS_SHARED_POOL.KEEP('SCOTT.PRO2')

PL/SQLプロシージャが正常に完了しました。

/*
SQL> SELECT owner,name,sharable_mem,loads,kept
2 FROM v$db_object_cache
3 WHERE type IN ('PROCEDURE')
4 ORDER BY loads desc;

OWNER NAME SHARABLE_MEM LOADS KEP
--------- -------- ------------------- ------- ------
SCOTT PRO2 442926  10 YES
SCOTT PRO1   8726  7 NO

上記の例で検索しているV$DB_OBJECT_CACHEビュー列については以下を参照ください。
<主な列>
・OWNER :オブジェクト所有者
・NAME :オブジェクト名
・TYPE :オブジェクト・タイプ
・SHARABLE_MEM :オブジェクトによる共有プールの使用メモリー量(バイト単位)
・LOADS :オブジェクトがロードされた回数
・KEPT :共有プールに固定されているかどうか

以上でDBMS_SHARED_POOLパッケージの説明は終了です。
メモリの断片化の対処策として、オブジェクトをライブラリ・キャッシュに固定する必要があるなどの場合にご参考ください。
第13章では、カーソルに関するパラメータを紹介します。

               
                        第13章 カーソルに関するパラメータの紹介