キャッシュで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 で指定された時間内に
使用されなかった場合も同様。