ITPub博客

Oracle11g新特性:SQL Result Cache [zt]

原创 Oracle 作者:xsb 时间:2011-01-17 13:48:41 0 删除 编辑

DB_BUFFER只能缓存访问过的BLOCK,部分解决了物理读的问题,查询仍然需要大量的逻辑读。

物化视图提供的是查询重写的功能,对于大部分的情况,只是简化了SQL的复杂度,即使是完全满足查询的条件,物化视图的扫描也是不可避免的。

而缓存结果集——RESULT CACHE则截然不同,它缓存的是查询的结果。不再需要大量的逻辑读,不再需要任何的复杂计算,而是直接将已经缓存的结果返回。

[@more@]

Server Result Cache通过在SGA中分配一个缓冲区来保存查询结果,Oracle引入了几个新的初始化参数来控制这个cache的大小:RESULT_CACHE_MODERESULT_CACHE_MAX_SIZE等。RESULT_CACHE_MAX_SIZE指明SGARESULT CACHE功能可以使用的最大的内存容量。如果这个参数设置为0,则关闭RESULT CACHE功能。参数result_cache_max_result则控制单个缓存结果可以占总的Server result cache大小的百分比。RESULT_CACHE_MODE参数设置Oracle如何使用RESULT CACHE,该参数有三个值:MANUALAUTOFORCE。可以在system、session、table或者语句级别来设置cache的使用。在语句级可以使用一个新的hint来控制是否缓存查询结果。Oracle新增了两个HINTRESULT_CACHENO_RESULT_CACHE。通过这两个提示,可以明确的指出下面的语句是否进行RESULT CACHE

Oracle提供了DBMS_RESULT_CACHE包来管理和维护RESULT CACHEOracle还新增了几个关于RESULT CACHE的系统视图,用户可以看到和RESULT CACHE相关的各种信息,视图包括:V$RESULT_CACHE_DEPENDENCYV$RESULT_CACHE_MEMORYV$RESULT_CACHE_OBJECTSV$RESULT_CACHE_STATISTICS等。

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

下面简单说明一下RESULT_CACHE_MODE的三种模式下,缓存结果集是如何工作的。

  • 当参数值设置为MANUAL时,只有通过HINT明确提示的SQL才会读取缓存结果集。如果不加提示,那么Oracle不会利用已经缓存的结果。
  • 而对于AUTO模式,Oracle如果发现缓冲结果集已经存在,那么就会使用。但是如果缓冲结果集不存在,Oracle并不会自动进行缓冲。只有使用HINT的情况下,Oracle才会将执行的结果集缓存。
  • 对于FORCE参数,顾名思义,就是会对所有的SQL进行缓存,除非明确使用NO_RESULT_CACHE提示。

RESULT CACHE功能对于下列情况是无效的:系统表和临时表;序列的NEXTVALCURRVAL伪列;SYSDATESYSTIMESTAMP等函数;所有非确定性PL/SQL函数。

REF:
Oracle11新特性——SQL缓存结果集(一)
Oracle11新特性——SQL缓存结果集(二) Oracle11新特性——SQL缓存结果集(三) Oracle11新特性——SQL缓存结果集(四) Oracle11新特性——SQL缓存结果集(五)

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

请登录后发表评论 登录
全部评论
  • 博文量
    66
  • 访问量
    3081114