結果キャッシュ機能(11g~)

11g以降のバージョンにおいてはクエリの結果をSGAにキャッシュとして保存しておき、結果が変動する可能性がある更新がない状態で再度同じクエリが発行されるとSGA上のキャッシュデータを返却することによりレスポンスを向上させる機能が追加されています。 結果キャッシュにはサーバー側の結果キャッシュとクライアント側の結果キャッシュの機能がありますが、 本ページではサーバー側結果キャッシュの機能について記載します。

結果キャッシュを効率的に使える環境

キャッシュはSQL文単位に存在すること、キャッシュされた結果はSGAに格納されること、キャッシュ結果が変更される可能性があるオペレーションが発生した場合はキャッシュは無効かされることから以下を満たす環境はこの機能を効率的に使用することができます。

・同じSQLが繰り返し実行される
・クエリが参照するオブジェクトが頻繁に更新されない
・最終的に返却されるクエリの結果セットのサイズが小さい

使用方法

以下の方法で使用することができます。

ヒント句による使用
「result_cache」というヒントを付与することで使用することができます。

例)
select /*+ result_cache */ count(*) from tab1

初期化パラメータ変更による使用
RESULT_CACHE_MODE初期化パラメータをデフォルトのMANUALからFORCEに変更することで 上述のresult_cacheヒントが内部的にSELECT文に追加されます。 しかしながら、基本的には各SQL文に対して有効かどうかの評価した上で効果が見込めるSQL文にのみヒントを付与して使用したほうがよいと思われます。

結果キャッシュの有効確認

キャッシュ機能が使用された場合は下記SQLのFind Count行のvalue値が加算され、 キャッシュされた結果セットが更新等により無効化されていた場合はInvalidation Countのvalue値が加算されます。
SQL> select name,value from V$RESULT_CACHE_STATISTICS where name = 'Find Count' or name = 'Invalidation Count';

NAME
----------------------------------------------------------------------------------------------------
VALUE
----------------------------------------------------------------------------------------------------
Find Count
27

Invalidation Count
2

サンプル

結果 キャッシュ機能をsqlplusで確認するサンプルです。コピーアンドペーストでご利用ください。
--テーブル、データの作成
create table set1 (col1 number ,col2 number,col3 varchar2(100),col4 varchar2(100));
ALTER TABLE set1 ADD CONSTRAINT PK_SET1 PRIMARY KEY(COL1);
declare
begin
  for i in 1..500000 loop
    insert into set1 values(i,500000-i,i || 'あああ',LPAD('a',trunc(DBMS_RANDOM.VALUE*100),'a'));
    if i mod 5000 = 0 then
      commit;
    end if;
  end loop;
end;
/
create table set2 as select * from set1;
ALTER TABLE set2 ADD CONSTRAINT PK_set2 PRIMARY KEY(COL1);
create table set3 as select * from set1;
ALTER TABLE set3 ADD CONSTRAINT PK_set3 PRIMARY KEY(COL1);

--SQL実行(1回目)
set timing on
select /*+ result_cache */ count(*) from (
select set1.col1 from (select col1 from set1 group by col1 order by col1 desc) set1, (select col1 from set2 group by col1) set2, (select col1 from set3 group by col1) set3 where set1.col1=set2.col1 and set1.col1=set3.col1 group by set1.col1
union select set1.col1 from (select col1 from set1 group by col1 order by col1 desc) set1, (select col1 from set2 group by col1) set2, (select col1 from set3 group by col1) set3 where set1.col1=set2.col1 and set1.col1=set3.col1 group by set1.col1
union select set1.col1 from (select col1 from set1 group by col1 order by col1 desc) set1, (select col1 from set2 group by col1) set2, (select col1 from set3 group by col1) set3 where set1.col1=set2.col1 and set1.col1=set3.col1 group by set1.col1
union select set1.col1 from (select col1 from set1 group by col1 order by col1 desc) set1, (select col1 from set2 group by col1) set2, (select col1 from set3 group by col1) set3 where set1.col1=set2.col1 and set1.col1=set3.col1 group by set1.col1
);

--SQL実行(2回目)
/

--表の削除
drop table set1 purge;
drop table set2 purge;
drop table set3 purge;

関連情報

初期化パラメータ
・RESULT_CACHE_MAX_RESULT
・RESULT_CACHE_MAX_SIZE
・RESULT_CACHE_MODE
・RESULT_CACHE_REMOTE_EXPIRATION

動的パフォーマンスビュー
・V$RESULT_CACHE_DEPENDENCY
・V$RESULT_CACHE_MEMORY
・V$RESULT_CACHE_OBJECTS
・V$RESULT_CACHE_STATISTICS

PLSQLパッケージ
・DBMS_RESULT_CACHE

マニュアル

リファレンス11g リリース1(11.1)
パフォーマンス・チューニング・ガイド11gリリース1(11.1)→7.6.1 結果キャッシュ・モードの使用
PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス11g リリース1(11.1)→107 DBMS_RESULT_CACHE
★ORACLE案件承ります