共有プールのチューニング(2) --- ライブラリキャッシュのチューニング

  • SQLの共有
    • バインド変数の使用
    • CURSOR_SHARINGパラメータをFORCEかSIMILARにする(アプリ側でバインド変数が使用できない場合)
    • V$LIBRARYCACHEGETHITRATIO(GETHITS/GETS)が90%以上を目標
    • V$SQLAREA:SQL毎の情報(ロード、解析、実行回数など)
    • V$SQLTEXT:SQL毎の情報(SQL全文、ハッシュ値など)
SQL> select namespace,gethitratio from v$librarycache ;

NAMESPACE                                     GETHITRATIO
--------------------------------------------- -----------
SQL AREA                                       .999459851
TABLE/PROCEDURE                                .999744462
BODY                                           .999220081
TRIGGER                                        .999380037
INDEX                                          .999940383
CLUSTER                                        .974212034
OBJECT                                                  1
PIPE                                                    1
JAVA SOURCE                                             1
JAVA RESOURCE                                           1
JAVA DATA                                               1

11行が選択されました。
  • SQL再解析の防止
    • 共有SQL領域で文が無効になっている=v$librarycacheのinvalidationsが増えている。(DDL文、ANALYZEコマンドなど)→どうしようもないかもしれない
    • 共有プール領域不足で割当解除されている→共有プールサイズを大きくすることを検討。v$librarycacheでキャッシュミス率SUM(reloads)/SUM(pins)を確認。1%未満にするのが目標。
    • システム統計情報(V$SYSSTAT)のハードパース回数が増えないようにがんばる
SQL> select name,value from v$sysstat
     where name like 'parse count%' ;

NAME                          VALUE
------------------------ ----------
parse count (total)         2189362
parse count (hard)             1091
parse count (failures)           26

SQL> select sysdate from dual ;

SYSDATE
--------
06-07-09

SQL> select name,value from v$sysstat
     where name like 'parse count%' ;

NAME                          VALUE
------------------------ ----------
parse count (total)         2189418
parse count (hard)             1093 ← 解析してしまった
parse count (failures)           26
  • ライブラリキャッシュに影響するその他のパラメータ
    • OPEN_CURSORS:セッションでオープンできる最大カーソル数
    • CURSOR_SPACE_FOR_TIME:すべてのカーソルがクローズするまで実行計画を共有SQL領域から破棄しないようにする。TUREにするとすべてのオープンカーソルがキャッシュされるようになる。TRUEすることはほとんど無い。
    • SESSION_CACHED_CURSORS:メモリにキャッシュするセッションカーソル数。SQL実行が高速化される。デフォルトは0
    • CURSOR_SHARING:カーソルをどれくらい無理矢理共有するか