キャッシュでSQLのパフォーマンスを改善
Oracle11g から、リザルトキャッシュという新機能が追加された。
この機能は実行された SQL を SGA にキャッシュするもので、
同じクエリを複数回実行された場合に、キャッシュ情報が
使用されるため、パフォーマンスが向上するというもの。
ただし従来よりキャッシュする機能はあるので、再利用されるようコーディング規約が
ビジッと決まっているシステムも多いと思うが、一体違いは何なのか?
結果そのものがキャッシュされる
従来型のキャッシュは読込ブロック全体が対象だったため、メモリ使用領域が多かったが、
リザルトキャッシュでは、結果そのものがキャッシュされる仕様となっている。
よって、パフォーマンスの向上が見込めるというメリットがある。
初期化パラメータ「result_cache_mode」
リザルトキャッシュは、初期化パラメータ result_cache_mode の
設定値によって動作が異なる。
MANUAL:手動でリザルトキャッシュさせる指定をした場合のみ有効(デフォルト)
FORCE:常に有効
このパラメータは、セッション単位での変更も可能。
SQL> show parameter result_cache_mode NAME TYPE VALUE ------------------ -------- -------- result_cache_mode string MANUAL
有効化
SQL> alter session set result_cache_mode = force;
変更後
SQL> show parameter result_cache_mode NAME TYPE VALUE ------------------ -------- -------- result_cache_mode string FORCE
ヒント句を使用した方法
なお、いちいち alter session や alter system を行わなくても、
ヒント句を使ったキャッシュ方法もある。
SQL> select /*+ RESULT_CACHE */ * from hoge;
キャッシュ情報の参照
キャッシュされた情報は、動的パフォーマンスビューの
v$result_cache_objects で参照できる。
SQL> desc v$result_cache_objects 名前 NULL? 型 ------------------ -------- ------------ ID NUMBER TYPE VARCHAR2(10) STATUS VARCHAR2(9) BUCKET_NO NUMBER HASH NUMBER NAME VARCHAR2(128) NAMESPACE VARCHAR2(5) CREATION_TIMESTAMP DATE CREATOR_UID NUMBER DEPEND_COUNT NUMBER BLOCK_COUNT NUMBER SCN NUMBER COLUMN_COUNT NUMBER PIN_COUNT NUMBER SCAN_COUNT NUMBER ROW_COUNT NUMBER ROW_SIZE_MAX NUMBER ROW_SIZE_MIN NUMBER ROW_SIZE_AVG NUMBER BUILD_TIME NUMBER LRU_NUMBER NUMBER OBJECT_NO NUMBER INVALIDATIONS NUMBER SPACE_OVERHEAD NUMBER SPACE_UNUSED NUMBER CACHE_ID VARCHAR2(93) CACHE_KEY VARCHAR2(93)
セッション単位、SQL文単位(ヒント句)で行えるので、
常に FORCE というのは現実的ではないかもしれない。
リザルトキャッシュは、同一の SQL を繰り返し行う場合に威力を発揮するが、
結果そのものがキャッシュされるという以上、対象テーブルのデータが変更
されたらキャッシュが無効になってしまう。
よって、対象データが頻繁に変更される環境には不向きと言える。
初期化パラメータ client_result_cache_lag で指定された時間内に
使用されなかった場合も同様。