Predicate Information (identified by operation id):
---------------------------------------------------
可以通过v$result_cache_objects查询相关的缓存数据信息,cache_id也就是刚才执行计划的name,这里可以看到1是结过缓存了。
select status,CREATION_TIMESTAMP,ROW_COUNT,NAME,SCAN_COUNT from v$result_cache_objects where cache_id='876b052dgt9fn7g34qrgk4btxm‘,可以查到结果缓存的相关信息,比如创建时间,花费的时间,存储的行数,被调用的次数,等等。
结果缓存是很容易失效的,如果结果集和从数据库查询出来的不一致,那就失效了,还有for update也会失效,上面介绍了对于某一特定语句进行了结果缓存,下面介绍一下动态参数控制服务器端结果缓存。
result_cache_max_size是指定结果缓存共享池的大小,这个值如果是0,那么就没这个特性了,一般都是自己根据共享池分配的,可以查看v$sgastat查看实际使用大小。
select name,sum(bytes) from v$sgastat where name like ’Result Cache%' group by name;
result_cache_mode指定结果缓存使用那种方式,有manual 和force,当manual时,需要在语句添加hint / *+ result_cache */,如果是force,只要不加 / *+ no_result_cache */的,都会使用结果缓存。
result_cache_max_result指定任何单个结果集可以使用的result_cache_max_size的数量,这是单个sql使用的最大值,默认5%
result_cache_remote_expiration指定基于远程对象的结果集的临时有效期(单位为分钟)
PL/SQL函数结果缓存:
这个和服务器端结果缓存差不多,只不过他支持PL/SQL函数,记住,只有函数,其他的PL/SQL是不行的,而且要输入和输出要一致才可以。
举例: create or replace function f1(a in number)
return number
result_cache relies_on(t1)
is
o_var number;
begin
select count(*) into o_var from t1 where id=a;
return o_var;
end;
/
大家可以用以上的例子多调用几次,可以看出函数结果缓存的优势。select count(f1(1)) from t1;