结果集缓存

和聚合物化视图类似,报表系统和数据仓库系统是最适合结果集缓存的,这些系统通常具有大量复杂的SQL,其中不少子查询包含聚合函数,如果能够尽可能重用这些已经计算过的聚合结果集,将极大的提升系统性能并降低服务器负载。默认情况下,服务端结果集大小为共享池大小的0.5%,如果人工设置了共享池大小,则为1%,如果默认值不合适,可以调整result_cache_max_size,该参数声明了用于结果集缓存的SGA大小,将该值更改为0可以禁用结果集缓存,此时通常是应用使用了物化视图进行聚合查询优化或没有很多聚合查询的OLTP系统。需要注意的是,结果集缓存默认是否启用由result_cache_mode控制,参数声明了Oracle如何管理结果集缓存的使用,默认为MANUAL,也就是SQL语句必须使用优化器提示才能使用结果集缓存;当设置为FORCE时表示所有独立执行的语句都可以认为结果集缓存的候选。相对于聚合物化视图可以针对整个表进行聚合,具体查询中可以使用不同的group by字段作为条件重写,结果集缓存只能根据具体的绑定变量进行,由于对子查询块抽象和判断是否共用的成本较高,所以直接基于SQL块的结果集缓存效果性价比在大部分情况下不算很好。

不过11g中PL/SQL函数新增的RESULT_CACHE子句更加有价值,传统的DETERMINISTIC选项仅对于当前SQL语句引用的函数有效,而且不支持PL/SQL函数中调用其他PL/SQL函数。RESULT_CACHE刚好弥补了DETERMINISTIC的弱项,它使得在多个会话、不同的RAC节点、PL/SQL块中都可以重用某个PL/SQL函数的执行结果,其使用如下:

create or replace function getXXXdays(v_tenantid    in varchar2,

v_fundcode    in varchar2,

v_agencyno    in varchar2,

v_currentdate in varchar2,

n_offset      in number,

n_skip        in number := 1,

v_ageregion   in number := 0)

return number deterministic

RESULT_CACHE RELIES_ON(ta_thkopenday)  --只要加上RESULT_CACHE RELIES_ON子句即可,依赖数据源可以有多个,多个之间逗号分隔

is

result number(8);

begin

…

end;

/

我们有不少逻辑调用了一个计算交易日期的函数,这个函数又调用了其他很多函数,类似于下面的引用关系:

getintervaldays

gethkliqdays

gethkrealdays

getliqdays

getrealdays

我们仅通过为各函数增加RESULT_CACHE子句,性能就提升了10%。

如果启用了结果集缓存特性,还需要注意,每个结果集缓存可用的内存大小并不是整个结果集缓存大小,而是受RESULT_CACHE_MAX_RESULT参数控制,其默认为RESULT_CACHE_MAX_SIZE的5%,因为结果集缓存本身的目的并非缓存大型SQL或子查询的结果,所以通常最多增加到10%就足够了,最后应定期监控v$result_cache_statistics和v$result_cache_objects确定结果集缓存的效果,以及是否有必要继续开启结果集缓存,还需要注意不要过多的在高并发的存储过程以及函数上依赖于结果集缓存,它可能会导致latch free竞争严重,进而适得其反造成性能下降。

关于oracle result_cache的更多相关文章

  1. 在Oracle 11.2的数据库中建表时遇到 RESULT_CACHE (MODE DEFAULT) ORA-00922: missing or invalid option

    在Oracle 11.2的数据库中建表时遇到 RESULT_CACHE (MODE DEFAULT)  ORA-00922: missing or invalid option hostdr:[/ho ...

  2. Oracle 11g新特性

    文章转自网络 Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(I ...

  3. oracle 11g 之 result cache

    oracle 11g 之 result cache 今天是2013-10-12,打算最近时间研究一下shared pool的相关原理以及awr报告分析.今天学习一下在oracle 11g shared ...

  4. [每日一题] 11gOCP 1z0-053 :2013-10-12 RESULT_CACHE在哪个池?.............................44

    转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/12657479 正确答案:B   Oracle 11g 新特性:Result Cache , ...

  5. Oracle数据库之PL/SQL过程与函数

    Oracle数据库之PL/SQL过程与函数 PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保存到数据 ...

  6. Oracle 11g 的PL/SQL函数结果缓存

    模拟Oracle性能诊断艺术做了两个试验样品.书上说的不承担RELIES_ON.果缓存的失效操作(result_cache RELIES_ON(test1,test2)).试验证明不正确,函数f1() ...

  7. Oracle数据库之开发PL/SQL子程序和包

    Oracle数据库之开发PL/SQL子程序和包   PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保 ...

  8. ORACLE当中自定义函数性优化浅析

    为什么函数影响性能 在SQL语句中,如果不合理的使用函数(Function)就会严重影响性能,其实这里想说的是PL/SQL中的自定义函数,反而对于一些内置函数而言,影响性能的可能性较小.那么为什么SQ ...

  9. Oracle 升级的必要性

    一.Oracle 历史 Oracle database 作为Oracle 公司的商业产品,凭借其稳定性和运行高效占据了全球三成以上的市场.并且主要是金融.政府等领域. Oracle 数据库拥有近40年 ...

随机推荐

  1. 从composer上在本地创建一个项目

    在想要创建项目的目录下,输入以下代码

  2. cf954H

    挖我自闭了这是什么东西啊. 给出一棵深度为  的树,其中深度为  的节点有  个儿子.问树上的简单路径中长度在  之间的每个有多少条.  表示对于在  层的  个节点,向下走  步的方案数  表示对于 ...

  3. Angel - MemoryDataBlock - angel.task.estimize.sample.number

    angel.task.estimize.sample.number val validData = new MemoryDataBlock[LabeledData](isVali) trainData ...

  4. RabbitMQ之路由键转发消息

    RabbitMQ学习 参考:https://www.jianshu.com/p/6b62a0ed2491 消息队列:目前流行的有 Kafka.RabbitMQ.ActiveMQ等 功能:为了解决消息的 ...

  5. Oracle课程档案,第九天

    lsnrctl status:查看监听状态 Oracle网络配置三部分组成:客户端,监听,数据库 配置文件:$ vi $ORACLE_HOME/network/admin/listener.ora v ...

  6. Java远程连接redis, 报错 Connection refused: connect

    在今天的学习Redis中报错 Connection refused: connect 我总结了有三种情况: 1.远程服务器中的Redis没有开启. 2.远程连接地址出错,或者是端口出错. 3.远程服务 ...

  7. The way to unwind the stack on Linux EABI

    I. probe the stack frame structure The original idea is to unwind the function call stack according ...

  8. jmeter安装与环境变量配置

    因jmeter是java开发的,要想运行java开发的程序,必须先下载JDK一.jdk 1.下载jdk  jdk下载地址:https://www.oracle.com/technetwork/java ...

  9. 安装php后无法动态加载库

    安装Apache.mysql.PHP并配置完成后使用phpinfo测试显示正常,但是无法动态增加库 原因:安装PHP后不会生成php.ini文件,但是phpinfo测试正常 解决方法: 1.查看配置文 ...

  10. postman进行接口测试

    1.添加header 2.入参为json格式 3.添加cookie 4.上传文件