- SQLの共有
- バインド変数の使用
- CURSOR_SHARINGパラメータをFORCEかSIMILARにする(アプリ側でバインド変数が使用できない場合)
- V$LIBRARYCACHEのGETHITRATIO(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:カーソルをどれくらい無理矢理共有するか