11g新特性之服务器结果缓存(result cache)

时间:2021-09-24 07:39:51

以前对oracle结果缓存这个特性没注意过,最近项目中有个地方刚好用了一下,效果很不错,这里总结一下。
服务器端结果缓存
服务器端结果缓存实在共享池中的一段内存区域,用于缓存sql或pl/sql函数的执行结果
工作原理
当查询开始执行的时候,首先在结果缓存中区查找看有没有先前的执行结果,如果结果存在,服务器直接返回结果而不是再次执行查询。如果查询结果不存在,服务器才去执行查询,并且看情况缓存执行结果。
当语句重复执行时,结果缓存的作用会时响应时间飞快。当缓存依赖的项目做过ddl,dml操作后,缓存结果就会失效。
result cache配置,oracle实例在共享池中分配result cache,
1.内存管理为Automatic shared memory managemen
数据库分配SGA_TARGET的0.50%给result cache。
2.内存管理为Manual shared memory management
数据库分配 SHARED_POOL_SIZE 的1%给result cache。
result cache管理方法
result cache会一直增长到它的上限,如果查询结果的大小大于可用的result cache内存,服务器不会缓存这个结果。
服务器使用LRU算法管理管理result cache,但是不会从结果缓存中自动释放内存。
三个初始化参数
RESULT_CACHE_MAX_SIZE:设定能分配给result cache的上限。
RESULT_CACHE_MAX_RESULT 缓存的最大条目数。
RESULT_CACHE_REMOTE_EXPIRATION
定义result cache依赖于远程对象的失效时间,默认为0s,即依赖于远程对象的查询结果不会缓存。

结果缓存可以使用 DBMS_RESULT_CACHE 包管理。
显示result cache的统计信息
SQL> SET SERVEROUTPUT ON
SQL> EXECUTE DBMS_RESULT_CACHE.MEMORY_REPORT

11g新特性之服务器结果缓存(result cache)

清理result cache
DBMS_RESULT_CACHE.FLUSH
结果缓存模式

RESULT_CACHE_MODE有manual 和 force
manual 是需要加/*+ RESULT_CACHE */提示后,结果才会缓存。
force 所有的结果都会缓存,/*+ NO_RESULT_CACHE */。

result cache的限制
1.查询中的表有临时表,或表在sys或system下的不会缓存。
2.sql查询中带有Sequence,CURRENT_DATE, CURRENT_TIMESTAMP, LOCAL_TIMESTAMP, USERENV/SYS_CONTEXT (with non-constant variables), SYS_GUID, SYSDATE, and SYS_TIMESTAMP 等结果不固定的函数。

测试 select /*+ result_cache*/ count(distinct owner) from testtab;

11g新特性之服务器结果缓存(result cache)

第二次执行

11g新特性之服务器结果缓存(result cache)

可见第二几乎不费时间。

pl/sql函数结果缓存。

测试函数定义如下。

create or replace function fun_wxc(p1 in varchar2) 
return number result_cache 
is
  rs number;
begin
  rs := p1;
  /*模拟做一些耗时操作*/
  sys.dbms_lock.sleep(10);
  return rs;
end;

 11g新特性之服务器结果缓存(result cache)

第一次执行为10s
再次执行瞬间出结果。