Result Cache

Improving Application Performance with Result Cache

http://www.oracle.com/technology/obe/11gr1_db/perform/rescache/res_cache.htm

参考文章
http://www.ningoo.net/html/2007/oracle11g_new_feature_server_result_cache.html
http://www.ningoo.net/html/2007/oracle11g_new_feature_server_result_cache2.html
http://www.ningoo.net/html/2007/oracle11g_new_feature_server_result_cache3.html

[@more@]

共享SQL和执行计划-》共享SQL执行后的结果

Server Result Cache通过在SGA中分配一个缓冲区来保存查询结果,Oracle引入了一个新的初始化参数来控制这个cache的大小: result_cache_max_size。可以在system、session、table或者语句级别来设置cache的使用。在语句级可以使用一个新的hint来控制是否缓存查询结果。另外,Oracle还提供了一个新的PL/SQL用来监控和管理Server Result Cache,比如可以清空整个cache的内容或者清空某个查询的结果,也可以生成cache的使用报告等。

Server Result Cache不仅仅能缓存整个查询的结果,也能缓存查询中某部分操作的结果,比如缓存一次排序的结果,就可以避免再次执行时的排序操作。对于一些比较耗资源的查询操作,缓存结果应该能很好的提升性能。

除了Server端引入Result Cache,Oracle11g另外一个值得期待的特性就是Client端cache机制的引入。通过OCI接口,在Client端也可以缓存查询结果。典型的场景就是我们在应用服务器端缓存查询结果,这样在前端执行该查询时,甚至不需要到数据库中去执行该查询。客户端结果缓存在OCI进程中,可以被该进程中的多个session或者线程共享。客户端缓存机制通过一个新的初始化参数来控制:client_result_cache_size,当该参数大于 0时,该特性被启用。同样的,该特性也可以在system、session、table或者语句级来设置。通过在服务端设置参数而不是客户端设置,可以集中的管理该特性,但是也可以在各个客户端单独进行设置,客户端的设置将覆盖服务端的设置。

重要参数
result_cache_max_size:如果result_cache_max_size=0则表示禁用该特性.
result_cache_max_result:控制单个缓存结果可以占总的Server result cache大小的百分比。
result_cache_mode:如果取值为auto,则优化器会自动判断是否将查询结果缓存;如果取值为 manual(这是默认值),则需要通过查询提示result_cache来告诉优化器是否缓存结果;如果取值为force,则系统会尽可能的缓存查询结果,当然,即使参数取值为force,也可以通过提示no_result_cache来拒绝缓存结果。

引入的package专门用于管理server result cache:dbms_result_cache
清空server result cache
SQL> exec dbms_result_cache.flush
PL/SQL procedure successfully completed.

查看server result cache的内存使用报告
SQL> set serveroutput on
SQL> exec dbms_result_cache.memory_report
R e s u l t C a c h e M e m o r y R e p o r t
[Parameters]
Block Size = 1K bytes
Maximum Cache Size = 1184K bytes (1184 blocks)
Maximum Result Size = 59K bytes (59 blocks)
[Memory]
Total Memory = 5132 bytes [0.006% of the Shared Pool]
... Fixed Memory = 5132 bytes [0.006% of the Shared Pool]
... Dynamic Memory = 0 bytes [0.000% of the Shared Pool]

PL/SQL procedure successfully completed.

动态性能视图v$result_cache_statistics可以知道server result cache的使用统计信息:
SQL> select * from v$result_cache_statistics;

ID NAME VALUE
---------- ------------------------------ ----------
1 Block Size (Bytes) 1024
2 Block Count Maximum 1184
3 Block Count Current 0
4 Result Size Maximum (Blocks) 59
5 Create Count Success 0
6 Create Count Failure 0
7 Find Count 0
8 Invalidation Count 0
9 Delete Count Invalid 0
10 Delete Count Valid 0

10 rows selected.

其他相关动态性能视图:
v$result_cache_objects
v$result_cache_memory
v$result_cache_dependency


实际的例子:

QL> select /*+ result_cache */ count(*) from test;

COUNT(*)
----------
11865


Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=48 Card=1)
1 0 RESULT CACHE OF '7rkq2h8sb7kdg5sjxw69z8c45g'
2 1 SORT (AGGREGATE)
3 2 TABLE ACCESS (FULL) OF 'TEST' (TABLE) (Cost=48 Card=12024)


Statistics
----------------------------------------------------------
337 recursive calls
0 db block gets
291 consistent gets
0 physical reads
0 redo size
352 bytes sent via SQL*Net to client
500 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
5 sorts (memory)
0 sorts (disk)
1 rows processed

我们可以看到RESULT CACHE OF '7rkq2h8sb7kdg5sjxw69z8c45g',即结果被缓存了。

再来看result cache的内存使用情况:
SQL> exec dbms_result_cache.memory_report
R e s u l t C a c h e M e m o r y R e p o r t
[Parameters]
Block Size = 1K bytes
Maximum Cache Size = 1184K bytes (1184 blocks)
Maximum Result Size = 59K bytes (59 blocks)
[Memory]
Total Memory = 103528 bytes [0.112% of the Shared Pool]
... Fixed Memory = 5132 bytes [0.006% of the Shared Pool]
... Dynamic Memory = 98396 bytes [0.107% of the Shared Pool]
....... Overhead = 65628 bytes
....... Cache Memory = 32K bytes (32 blocks)
........... Unused Memory = 30 blocks
........... Used Memory = 2 blocks
............... Dependencies = 1 blocks (1 count)
............... Results = 1 blocks
................... SQL = 1 blocks (1 count)

PL/SQL procedure successfully completed.

可以看到Dynamic Memory被使用了。


查看v$result_cache_statistics
SQL> select * from v$result_cache_statistics;

ID NAME VALUE
---------- ------------------------------ ----------
1 Block Size (Bytes) 1024
2 Block Count Maximum 1184
3 Block Count Current 32
4 Result Size Maximum (Blocks) 59
5 Create Count Success 1
6 Create Count Failure 0
7 Find Count 0
8 Invalidation Count 0
9 Delete Count Invalid 0
10 Delete Count Valid 0
可以看到Create Count Success的值是1,说明成功的缓存了一笔记录。


再次执行该查询
SQL> select /*+ result_cache */ count(*) from test;

COUNT(*)
----------
11865


Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=48 Card=1)
1 0 RESULT CACHE OF '7rkq2h8sb7kdg5sjxw69z8c45g'
2 1 SORT (AGGREGATE)
3 2 TABLE ACCESS (FULL) OF 'TEST' (TABLE) (Cost=48 Card=12024)

Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
352 bytes sent via SQL*Net to client
500 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

注意到这里consistent gets=0,也就是该查询甚至不产生逻辑读了,也就是直接从result cache中获得了查询结果。

查看v$result_cache_statistics
SQL> select * from v$result_cache_statistics;

ID NAME VALUE
---------- ------------------------------ ----------
1 Block Size (Bytes) 1024
2 Block Count Maximum 1184
3 Block Count Current 32
4 Result Size Maximum (Blocks) 59
5 Create Count Success 1
6 Create Count Failure 0
7 Find Count 1
8 Invalidation Count 0
9 Delete Count Invalid 0
10 Delete Count Valid 0
注意到Find Count = 1,说明上次缓存的结果被后续的查询应用了一次。如果继续执行该查询,可以发现该统计信息相应增加。


要在PL/SQL Function中启用result cache特性,只需要在创建function时添加RESULT_CACHE子句即可。另外还有一个RELIES_ON子句,可以指定该function依赖的对象,如果该对象改变则会导致该function缓存结果失效。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11903161/viewspace-980969/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/11903161/viewspace-980969/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值