SQL 查询结果高速缓存可在数据库内存中对查询结果集和查询碎片启用显式高速缓存。存储在共享池(Share Pool)中的专用内存缓冲区
一.Result Set Caching 说明
Oracle 官网的说明,参考:
7.6 Managing the Server and ClientResult Caches
1.1 概述
SQL 查询结果高速缓存可在数据库内存中对查询结果集和查询碎片启用显式高速缓存。存储在共享池(Share Pool)中的专用内存缓冲区可用于存储和检索高速缓存的结果。对查询访问的数据库对象中的数据进行修改后,存储在该高速缓存中的查询结果将失效。
虽然SQL 查询高速缓存可用于任何查询,但最适用于需要访问大量行却仅返回其中一少部分的语句。数据仓库应用程序大多属于这种情况。
注:
(1) RAC 配置中的每个节点都有一个专用的结果高速缓存。一个实例的高速缓存结果不能供另一个实例使用。但是,失效会对多个实例产生影响。要处理RAC 实例之间与SQL 查询结果高速缓存相关的所有同步操作,需对每个实例使用专门的RCBG 进程。
(2) 通过并行查询,可对整个结果进行高速缓存(在RAC 中,是在查询协调程序实例上执行高速缓存的),但单个并行查询进程无法使用高速缓存。
简言之:
• 高速缓存查询或查询块的结果以供将来重用。
• 可跨语句和会话使用高速缓存,除非该高速缓存已过时。
• 优点:
– 可扩展性
– 降低内存使用量
• 适用的语句:
– 访问多行
– 返回少数行
1.2 设置SQL查询结果高速缓存
查询优化程序根据初始化参数文件中RESULT_CACHE_MODE 参数的设置管理结果高速缓存机制。
可以使用此参数确定优化程序是否将查询结果自动发送到结果高速缓存中。可以在系统和会话级别设置RESULT_CACHE_MODE 参数。
参数值可以是AUTO、MANUAL 和FORCE:
(1) 设置为AUTO 时,优化程序将根据重复的执行操作确定将哪些结果存储在高速缓存中。
(2) 设置为MANUAL(默认值)时,必须使用RESULT_CACHE 提示指定在高速缓存中存储特定结果。
(3) 设置为FORCE 时,所有结果都将存储在高速缓存中。
注:对于AUTO 和FORCE 设置,如果语句中包含[NO_]RESULT_CACHE 提示,则该提示优先于参数设置。
1.3 管理SQL查询结果高速缓存
可以改变初始化参数文件中的多种参数设置,以管理数据库的SQL 查询结果高速缓存。
默认情况下,数据库会为SGA 中共享池(Share Pool)内的结果高速缓存分配内存。分配给结果高速缓存的内存大小取决于SGA的内存大小以及内存管理系统。可以通过设置RESULT_CACHE_MAX_SIZE参数来更改分配给结果高速缓存的内存。如果将结果高速缓存的值设为0,则会禁用此结果高速缓存。此参数的值将四舍五入到不超过指定值的32 KB的最大倍数。如果四舍五入得到的值是0,则会禁用该功能。
使用RESULT_CACHE_MAX_RESULT参数可以指定任一结果可使用的最大高速缓存量。默认值为5%,但可指定1 到100 之间的任一百分比值。可在系统和会话级别上实施此参数。
使用RESULT_CACHE_REMOTE_EXPIRATION参数可以指定依赖于远程数据库对象的结果保持有效的时间(以分钟为单位)。默认值为0,表示不会高速缓存使用远程对象的结果。
将此参数设置为非零值可能会生成过时的信息:例如,当结果使用的远程表在远程数据库上发生了更改时。
使用以下初始化参数进行管理:
1.RESULT_CACHE_MAX_SIZE
– 此参数设置分配给结果高速缓存的内存。
– 如果将其值设为0,则会禁用结果高速缓存。
– 默认值取决于其它内存设置(memory_target的0.25% 或sga_target 的0.5% 或shared_pool_size 的1%)
– 不能大于共享池的75%
2.RESULT_CACHE_MAX_RESULT
– 设置单个结果的最大高速缓存
– 默认值为5%
3.RESULT_CACHE_REMOTE_EXPIRATION
– 根据远程数据库对象设置高速缓存结果的过期时间
– 默认值为0
1.4 使用Result_Cache 提示
如果要使用查询结果高速缓存并将RESULT_CACHE_MODE初始化参数设置为MANUAL,则必须在查询中显式指定RESULT_CACHE 提示。这会在查询的执行计划中引入ResultCache运算符。执行查询时,ResultCache 运算符将查找结果高速缓存,以检查该查询结果是否存在于高速缓存中。如果存在,则直接从高速缓存检索该结果。如果高速缓存中不存在该查询结果,则执行查询。结果将以输出形式返回,也存储在结果高速缓存中。
如果将RESULT_CACHE_MODE 初始化参数设置为AUTO 或FORCE,并且不希望将查询结果存储在结果高速缓存中,则必须在查询中使用NO_RESULT_CACHE 提示。例如,如果在初始化参数文件中RESULT_CACHE_MODE的值为FORCE,并且不希望对EMPLOYEES表使用结果高速缓存,则需要使用NO_RESULT_CACHE 提示。
注:应优先于参数设置使用[NO_]RESULT_CACHE提示。
1.5 使用DBMS_RESULT_CACHE 程序包
DBMS_RESULT_CACHE程序包提供了统计信息、信息和运算符,可以管理查询结果高速缓存的内存分配。可以使用DBMS_RESULT_CACHE程序包执行多种操作,如查看高速缓存的状态(OPEN 或CLOSED)、检索有关高速缓存内存使用量的统计信息、刷新高速缓存。
例如,要查看内存分配统计信息,请使用以下SQL 过程:
SQL> set serveroutput on
SQL> executedbms_result_cache.memory_report
DBMS_RESULT_CACHE 程序包用于:
(1) 管理查询结果高速缓存的内存分配
(2) 查看高速缓存的状态:
SELECTDBMS_RESULT_CACHE.STATUS FROM DUAL;
(3)检索有关高速缓存内存使用量的统计信息:
EXECUTEDBMS_RESULT_CACHE.MEMORY_REPORT;
(4) 删除所有现有结果并清空高速缓存:
EXECUTEDBMS_RESULT_CACHE.FLUSH;
(5)使依赖于指定对象的高速缓存结果失效:
EXECDBMS_RESULT_CACHE.INVALIDATE('JFV','MYTAB');
1.6 查看SQL结果高速缓存字典信息
(G)V$RESULT_CACHE_STATISTICS : 列出各种高速缓存设置和内存使用量统计信息
(G)V$RESULT_CACHE_MEMORY : 列出所有内存块和相应的统计信息
(G)V$RESULT_CACHE_OBJECTS: 列出所有对象(高速缓存结果和依赖性)及其属性
(G)V$RESULT_CACHE_DEPENDENCY: 列出高速缓存结果之间的依赖性详细信息及依赖性
1.7 SQL 查询结果高速缓存:注意事项
对于用户编写的基于函数的索引中使用的任何函数,必须使用DETERMINISTIC 关键字声明该函数对任何指定的输入参数值集始终返回相同的输出值。
(1) 只有在高速缓存处于未使用状态下才能运行清除操作,要进行刷新,,需要禁用(关闭)高速缓存。
(2) 对于绑定变量,将使用变量值对高速缓存结果进行参数化。只能找到相同变量值的高速缓存结果。也就是说,不同的值或绑定变量名称将导致高速缓存未命中。
注意事项如下:
1.对包含以下内容的查询禁用结果高速缓存:
– 临时表或字典表
– 不确定的PL/SQL 函数
– CURRVAL 和NEXTVAL 序列
– current_date、sysdate 和sys_guid 等SQL 函数
2.远程数据库上的DML/DDL 不会使高速缓存结果过期。
3.可高速缓存闪回查询。
4.结果高速缓存不会自动释放内存。
– 它将不断增长,直到达到最大大小。
– DBMS_RESULT_CACHE.FLUSH 会清除内存。
5.绑定变量
– 将使用变量值对高速缓存结果进行参数化。
– 只能找到相同变量值的高速缓存结果。
6.对于以下情况,不会生成高速缓存结果:
– 查询是基于数据的非当前版本构建的(强制实施读取一致性)
– 当前会话在查询的表中存在未完成的事务处理
1.8 OCI 客户机查询高速缓存
在Oracle Database11g 中,可以使用Oracle 调用接口(OCI) 客户机查询高速缓存对客户机内存中的查询结果集启用高速缓存。