合 Oracle优化中的结果集缓存
简介
结果集缓存(Result Cache)是Oracle 11g的新特性,用于存储经常使用的SQL语句和函数的查询结果。当相同语句再次执行的时候,Oracle就不用再次重复执行(包括扫描索引、回表、计算、逻辑读、物理读等操作),而是直接访问内存得到结果。结果集缓存可以将SQL语句查询的结果缓存在内存(SGA的Shared Pool)中,从而显著地改进需要多次执行和查询相同结果的SQL语句的性能。
结果集缓存的优点是可以重用相同的结果集,减少逻辑I/O,从而提高系统性能。结果集缓存最适合的是静态表(例如只读表),即结果集缓存最适合返回同样结果的查询。
若SQL语句中包含的对象(例如表)做了UPDATE,INSERT,DELETE或是DDL操作,则相关的所有SQL的缓存结果集就自动失效了。所以,Result Cache只对那些在平时几乎没有任何DML操作的只读表比较有用,可以减轻I/O的压力。
对于一些固定性的小的查询结果集或统计性的SQL语句(例如,SQL语句非常复杂,但是最终返回的结果集很简单,只包含少数的几行数据;或者一个非常复杂的SQL,包括好几个大表最后做了一个count操作只返回1行结果)可以使用结果集缓存(Result Cache)。对于一些常用的小表可以使用保留池(Keep Pool)。
在实际情况中,结果集缓存仅在少数的情况下是有效的。在以下情况中,结果集不会被缓存:
① 查询使用非确定性的函数、序列和临时表的结果集不会被缓存。
② 查询违反了读一致性时结果集将不会被缓存。
③ 引用数据字典视图的查询的结果集不会被缓存。
④ 查询结果集大于可用缓存结果集可用空间的不会被缓存。
⑤ 对依赖对象的任何改变(DML、DDL)都会使整个缓存的结果集变为无效,结果集缓存最适合那些只读或接近只读的表。
⑥ ADG的备库不能使用结果集缓存。
SQL语句中通过/*+ result_cache*/
提示实现result cache,pl/sql函数通过建函数时的result_cache子句实现。
分类
Oracle数据库引擎提供了3种结果集缓存,包括:服务器查询结果集缓存、PL/SQL函数结果集缓存和客户端结果集缓存。
(一)服务器查询结果集缓存
服务器查询结果集缓存由以下一些参数控制:
RESULT_CACHE_MODE:该参数用来控制结果集缓存的操作模式。
AUTO表示优化程序将根据重复的执行操作确定将哪些结果存储在高速缓存中。
MANUAL表示只有使用了RESULT_CAHCE提示的查询或对带有
RESULT_CACHE
属性的表访问的查询才会被缓存,MANUAL为该参数的默认值。FORCE表示所有合适的查询都会被缓存。
本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!