[Oracle] 共有プールサイズの監視とチューニング | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

共有プールはライブラリキャッシュ、ディクショナリキャッシュとして使われるメモリー領域で、ライブラリキャッシュには解析されたSQLやPL/SQLプロシージャとその実行計画などがキャッシュされており、ディクショナリキャッシュにはデータベース内のオブジェクトに関する情報がキャッシュされています。

Oracleデータベースにアクセスする際には、これらの領域にキャッシュされたデータをなるべく再利用したほうが効率がいいということになります。


これらの領域が効率よく再利用されているかどうかは、各領域のキャッシュヒット率で判断します。

ライブラリキャッシュヒット率はv$librarycacheから以下の要領で算出します。

select sum( pins ) TOTAL_PINS, sum( reloads ) TOTAL_RELOADS,
  trunc( ( 1 - sum( reloads ) / sum( pins ) ) * 100, 3 ) "HIT_RATIO(%)"
  from v$librarycache;

TOTAL_PINS TOTAL_RELOADS HIT_RATIO(%)
---------- ------------- ------------
  75344388         43835       99.941

ディクショナリキャッシュヒット率はv$rowcacheから以下の要領で算出します。

select sum( gets ) TOTAL_GETS, sum( getmisses ) TOTAL_MISSES,
  trunc( ( 1 - sum( getmisses ) / sum( gets ) ) * 100, 3 ) "HIT_RATIO(%)"
  from v$rowcache;

TOTAL_GETS TOTAL_MISSES HIT_RATIO(%)
---------- ------------ ------------
 174878489       122923       99.929

ライブラリキャッシュヒット率は99%以上、ディクショナリキャッシュヒット率は95%以上が望ましいとされています。

キャッシュヒット率が著しく低い場合は、共有プールサイズが小さすぎる可能性があるため、初期化パラメータファイルSHARED_POOL_SIZEの値を大きくすることを検討します。

また、ライブラリキャッシュヒット率が低い場合は、バインド変数が有効に利用されているかどうかなど、SQLがなるべく再利用されるようアプリケーション側を見直すことも重要です。