oracle 11g 之 result cache
oracle 11g 之 result cache
今天是2013-10-12,打算最近时间研究一下shared pool的相关原理以及awr报告分析。今天学习一下在oracle 11g shared pool中新增的一个cache 那就是result cache。
从上图可以看出在oracle 11g 的shared pool中存有对sql进行存储、存储sql执行计划、sql解析树等信息的library cache可以通过查看v$librarycahe视图了解其分配情况,以及row CACHE(data dictionary cache)可以查看v$rowcache视图了解其分配情况,对于这两部分内容咱不讨论,但是可以看一下如下这个图,大体明白这两个component的作用原理。
现在开始研究一下result cache,对于oracle 11g 分为client result cache以及server result cache,前者在client进行内存的分配,后者对于数据库server进行内存分配,现在看一下server result cache(如下皆是server result cache内容)。说白了,result cache 就是为了缓存结果集的一块区域,主要是缓存sql 查询结果集以及pl/sql function结果集。
对于 result cache存在几个参数,如下:
result_cache_max_result integer
result_cache_max_size big integer
result_cache_mode string MANUAL(AUTO、FORCE)
1)、result_cache_max_result 表示对于单个的缓存结果占整个result cache 大小的百分比。
2)、result_cache_max_size 参数用于设置该result cache 的大小,是一个动态参数,该参数为0 则说明result cache 功能禁用了。
3)、result_cache_mode,表示result cache的模式,其中有manual、force。manual 表示只有使用hints(result_cache)才可以对其结果进行缓存且当从result cache中获取结果集的时候也必须使用hints(result cache)参数;force表示强制对结果集进行缓存 oracle对该参数的设置不建议,如下:
FORCE mode is not recommended because the database and clients will attempt to cache all queries, which may create significant performance and latching overhead. Moreover, because queries that call non-deterministic PL/SQL functions are also cached, enabling the result cache in such a broad-based manner may cause material changes to the results.
如果需要不对操作进行缓存可以使用hints(no_result_cache)进行设置。
如下是练习过程:
一、
设置result cache 大小为20M,模式为manual,每个结果集占用总的cache比例为50%(为了测试方便);
- SQL> alter system set result_cache_mode=manual;
- System altered.
- SQL> alter system set result_cache_max_result=50;
- System altered.
- SQL> show parameter result_cache
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- client_result_cache_lag big integer 3000
- client_result_cache_size big integer 0
- <span style="color:#ff6666">result_cache_max_result integer 50
- result_cache_max_size big integer 20M
- result_cache_mode string MANUAL
- </span>result_cache_remote_expiration integer 0
- SQL>
那么启用result cache 与不启用的效果在那呢?如下测试见证分晓!
eg:
- SQL> set autotrace trace
- SQL> select count(*) from rhys.amy;
- Execution Plan
- ----------------------------------------------------------
- Plan hash value: 2204613761
- -------------------------------------------------------------------
- | Id | Operation | Name | Rows | Cost (%CPU)| Time |
- -------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 348 (1)| 00:00:05 |
- | 1 | SORT AGGREGATE | | 1 | | |
- | 2 | TABLE ACCESS FULL| AMY | 87260 | 348 (1)| 00:00:05 |
- -------------------------------------------------------------------
- Statistics
- ----------------------------------------------------------
- 61 recursive calls
- 0 db block gets
- <span style="color:#ff0000"> 1271 consistent gets
- 1246 physical reads
- </span> 0 redo size
- 528 bytes sent via SQL*Net to client
- 523 bytes received via SQL*Net from client
- 2 SQL*Net roundtrips to/from client
- 5 sorts (memory)
- 0 sorts (disk)
- 1 rows processed
- <span style="color:#ff0000">SQL> r
- 1* select count(*) from rhys.amy
- </span>
- Execution Plan
- ----------------------------------------------------------
- Plan hash value: 2204613761
- -------------------------------------------------------------------
- | Id | Operation | Name | Rows | Cost (%CPU)| Time |
- -------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 348 (1)| 00:00:05 |
- | 1 | SORT AGGREGATE | | 1 | | |
- | 2 | TABLE ACCESS FULL| AMY | 87260 | 348 (1)| 00:00:05 |
- -------------------------------------------------------------------
- Statistics
- ----------------------------------------------------------
- 0 recursive calls
- 0 db block gets
- <span style="color:#ff0000"> 1248 consistent gets
- 1246 physical reads
- </span> 0 redo size
- 528 bytes sent via SQL*Net to client
- 523 bytes received via SQL*Net from client
- 2 SQL*Net roundtrips to/from client
- 0 sorts (memory)
- 0 sorts (disk)
- 1 rows processed
- SQL> r
- 1* select count(*) from rhys.amy
- Execution Plan
- ----------------------------------------------------------
- Plan hash value: 2204613761
- -------------------------------------------------------------------
- | Id | Operation | Name | Rows | Cost (%CPU)| Time |
- -------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 348 (1)| 00:00:05 |
- | 1 | SORT AGGREGATE | | 1 | | |
- | 2 | TABLE ACCESS FULL| AMY | 87260 | 348 (1)| 00:00:05 |
- -------------------------------------------------------------------
- Statistics
- ----------------------------------------------------------
- 0 recursive calls
- 0 db block gets
- <span style="color:#ff0000"> 1248 consistent gets
- 1246 physical reads
- </span> 0 redo size
- 528 bytes sent via SQL*Net to client
- 523 bytes received via SQL*Net from client
- 2 SQL*Net roundtrips to/from client
- 0 sorts (memory)
- 0 sorts (disk)
- 1 rows processed
- SQL> SQL>
- SQL>
首先看到查看rhys下的amy这张表在稳定下来的时候一致性读为1248,物理读为1246(万源之恶)。
现在使用result cache 功能。
- <span style="color:#ff0000">SQL> select /*+result_cache*/ count(*) from rhys.amy;
- </span>
- Execution Plan
- ----------------------------------------------------------
- Plan hash value: 2204613761
- ------------------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Cost (%CPU)| Time |
- ------------------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 348 (1)| 00:00:05 |
- | 1 | RESULT CACHE | 6tux55tbcpqfj66980yb24pfbh | | | |
- | 2 | SORT AGGREGATE | | 1 | | |
- | 3 | TABLE ACCESS FULL| AMY | 87260 | 348 (1)| 00:00:05 |
- ------------------------------------------------------------------------------------------
- Result Cache Information (identified by operation id):
- ------------------------------------------------------
- 1 - column-count=1; dependencies=(RHYS.AMY); attributes=(single-row); name="select /*+result_cache*/ count(*) from rhys.amy"
- Statistics
- ----------------------------------------------------------
- 0 recursive calls
- 0 db block gets
- <span style="color:#ff0000"> 1248 consistent gets
- 1246 physical reads
- </span> 0 redo size
- 528 bytes sent via SQL*Net to client
- 523 bytes received via SQL*Net from client
- 2 SQL*Net roundtrips to/from client
- 0 sorts (memory)
- 0 sorts (disk)
- 1 rows processed
第一次执行该语句并将其缓存到result cache中,一致性读以及物理 读没有变化。
如下使用hints(result_cache)进行在此查询该结果集。如下:
- SQL> select /*+result_cache*/ count(*) from rhys.amy;
- Execution Plan
- ----------------------------------------------------------
- Plan hash value: 2204613761
- ------------------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Cost (%CPU)| Time |
- ------------------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 348 (1)| 00:00:05 |
- | 1 | RESULT CACHE | 6tux55tbcpqfj66980yb24pfbh | | | |
- | 2 | SORT AGGREGATE | | 1 | | |
- | 3 | TABLE ACCESS FULL| AMY | 87260 | 348 (1)| 00:00:05 |
- ------------------------------------------------------------------------------------------
- Result Cache Information (identified by operation id):
- ------------------------------------------------------
- 1 - column-count=1; dependencies=(RHYS.AMY); attributes=(single-row); name="select /*+result_cache*/ count(*) from rhys.amy"
- Statistics
- ----------------------------------------------------------
- 0 recursive calls
- 0 db block gets
- <span style="color:#ff0000"> 0 consistent gets
- 0 physical reads
- </span> 0 redo size
- 528 bytes sent via SQL*Net to client
- 523 bytes received via SQL*Net from client
- 2 SQL*Net roundtrips to/from client
- 0 sorts (memory)
- 0 sorts (disk)
- 1 rows processed
- SQL>
可见物理读和一致性读都没有了,直接获得了结果集。这是好事啊。呵呵。
对于mode为force模式演示如下:
- <span style="color:#ff0000">SQL> alter system set result_cache_mode=force;
- </span>
- System altered.
- SQL>
- SQL> set autotrace trace
- SQL> select count(*) from rhys.amy;
- Execution Plan
- ----------------------------------------------------------
- Plan hash value: 2204613761
- ------------------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Cost (%CPU)| Time |
- ------------------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 348 (1)| 00:00:05 |
- | 1 | RESULT CACHE | 6tux55tbcpqfj66980yb24pfbh | | | |
- | 2 | SORT AGGREGATE | | 1 | | |
- | 3 | TABLE ACCESS FULL| AMY | 87260 | 348 (1)| 00:00:05 |
- ------------------------------------------------------------------------------------------
- Result Cache Information (identified by operation id):
- ------------------------------------------------------
- 1 - column-count=1; dependencies=(RHYS.AMY); attributes=(single-row); name="select count(*) from rhys.amy"
- Statistics
- ----------------------------------------------------------
- 63 recursive calls
- 8 db block gets
- <span style="color:#ff0000"> 1327 consistent gets
- 1246 physical reads
- </span> 0 redo size
- 528 bytes sent via SQL*Net to client
- 523 bytes received via SQL*Net from client
- 2 SQL*Net roundtrips to/from client
- 10 sorts (memory)
- 0 sorts (disk)
- 1 rows processed
- SQL> r
- 1* select count(*) from rhys.amy
- Execution Plan
- ----------------------------------------------------------
- Plan hash value: 2204613761
- ------------------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Cost (%CPU)| Time |
- ------------------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 348 (1)| 00:00:05 |
- | 1 | RESULT CACHE | 6tux55tbcpqfj66980yb24pfbh | | | |
- | 2 | SORT AGGREGATE | | 1 | | |
- | 3 | TABLE ACCESS FULL| AMY | 87260 | 348 (1)| 00:00:05 |
- ------------------------------------------------------------------------------------------
- Result Cache Information (identified by operation id):
- ------------------------------------------------------
- 1 - column-count=1; dependencies=(RHYS.AMY); attributes=(single-row); name="select count(*) from rhys.amy"
- Statistics
- ----------------------------------------------------------
- 0 recursive calls
- 0 db block gets
- <span style="color:#ff0000"> 0 consistent gets
- 0 physical reads
- </span> 0 redo size
- 528 bytes sent via SQL*Net to client
- 523 bytes received via SQL*Net from client
- 2 SQL*Net roundtrips to/from client
- 0 sorts (memory)
- 0 sorts (disk)
- 1 rows processed
- SQL>
另外在联机手册中并没提及到result_cache_mode 存在auto模式,但是我在不经意输错的是否发现了这个值。
SQL> alter system set result_cache_mode=false;
alter system set result_cache_mode=false
*
ERROR at line 1:
ORA-00096: invalid value FALSE for parameter result_cache_mode, must be from amongFORCE, MANUAL, AUTO
查看资料发现auto,是只有使用hints的时候才能起作用,但是当再次查询结果的时候没必要在使用hints了,而是直接把结果取出来。测试如下:
- SQL> set autotrace off
- SQL> execute dbms_result_cache.flush;
- PL/SQL procedure successfully completed.
- <span style="color:#ff0000">SQL> alter system set result_cache_mode=auto;
- </span>
- System altered.
- SQL> set autotrace trace
- SQL> select /*+result_cache*/ count(*) from rhys.amy;
- Execution Plan
- ----------------------------------------------------------
- Plan hash value: 2204613761
- ------------------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Cost (%CPU)| Time |
- ------------------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 348 (1)| 00:00:05 |
- | 1 | RESULT CACHE | 6tux55tbcpqfj66980yb24pfbh | | | |
- | 2 | SORT AGGREGATE | | 1 | | |
- | 3 | TABLE ACCESS FULL| AMY | 87260 | 348 (1)| 00:00:05 |
- ------------------------------------------------------------------------------------------
- Result Cache Information (identified by operation id):
- ------------------------------------------------------
- 1 - column-count=1; dependencies=(RHYS.AMY); attributes=(single-row); name="select /*+result_cache*/ count(*) from rhys.amy"
- Statistics
- ----------------------------------------------------------
- 49 recursive calls
- 0 db block gets
- 1275 consistent gets
- 1246 physical reads
- 0 redo size
- 528 bytes sent via SQL*Net to client
- 523 bytes received via SQL*Net from client
- 2 SQL*Net roundtrips to/from client
- 5 sorts (memory)
- 0 sorts (disk)
- 1 rows processed
- SQL> r
- 1* select /*+result_cache*/ count(*) from rhys.amy
- Execution Plan
- ----------------------------------------------------------
- Plan hash value: 2204613761
- ------------------------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Cost (%CPU)| Time |
- ------------------------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 348 (1)| 00:00:05 |
- | 1 | RESULT CACHE | 6tux55tbcpqfj66980yb24pfbh | | | |
- | 2 | SORT AGGREGATE | | 1 | | |
- | 3 | TABLE ACCESS FULL| AMY | 87260 | 348 (1)| 00:00:05 |
- ------------------------------------------------------------------------------------------
- Result Cache Information (identified by operation id):
- ------------------------------------------------------
- 1 - column-count=1; dependencies=(RHYS.AMY); attributes=(single-row); name="select /*+result_cache*/ count(*) from rhys.amy"
- Statistics
- ----------------------------------------------------------
- 0 recursive calls
- 0 db block gets
- <span style="color:#ff0000"> 0 consistent gets
- 0 physical reads
- </span> 0 redo size
- 528 bytes sent via SQL*Net to client
- 523 bytes received via SQL*Net from client
- 2 SQL*Net roundtrips to/from client
- 0 sorts (memory)
- 0 sorts (disk)
- 1 rows processed
二、
result cache 管理
对于11g中新增了result cache 那么也新增了4个视图以及一个包。
相关视图如下:
- v$result_cache_dependency
- v$result_cache_memory
- v$result_cache_objects
- v$result_cache_statistics
就不在介绍了,可以参考联机手册进行分析以及学习:
http://www.oracle.com/pls/db112/search?word=v$result_cache_
现在看一个dbms_result_cache包:
存在有6个subprograms,
Subprogram Description BYPASS Procedure
Sets the bypass mode for the Result Cache
FLUSH Function & Procedure
Attempts to remove all the objects from the Result Cache, and depending on the arguments retains or releases the memory and retains or clears the statistics
INVALIDATE Functions & Procedures
Invalidates all the result-set objects that dependent upon the specified dependency object
INVALIDATE_OBJECT Functions & Procedures
Invalidates the specified result-set object(s)
MEMORY_REPORT Procedure
Produces the memory usage report for the Result Cache
STATUS Function
Checks the status of the Result Cache
演示二个:
其他参考:
http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_result_cache.htm#CHDJCFJG
[sql] view plaincopyprint?- SQL> set serveroutput on
- SQL> execute 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 = 20M bytes (20K blocks)
- Maximum Result Size = 10M bytes (10K blocks)
- [Memory]
- Total Memory = 168264 bytes [0.134% of the Shared Pool]
- ... Fixed Memory = 5352 bytes [0.004% of the Shared Pool]
- ... Dynamic Memory = 162912 bytes [0.129% of the Shared Pool]
- ....... Overhead = 130144 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.
- SQL> execute dbms_result_cache.memory_report(true);
- 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 = 20M bytes (20K blocks)
- Maximum Result Size = 10M bytes (10K blocks)
- [Memory]
- Total Memory = 168264 bytes [0.134% of the Shared Pool]
- ... Fixed Memory = 5352 bytes [0.004% of the Shared Pool]
- ....... Memory Mgr = 200 bytes
- ....... Cache Mgr = 208 bytes
- ....... Bloom Fltr = 2K bytes
- ....... State Objs = 2896 bytes
- ... Dynamic Memory = 162912 bytes [0.129% of the Shared Pool]
- ....... Overhead = 130144 bytes
- ........... Hash Table = 64K bytes (4K buckets)
- ........... Chunk Ptrs = 24K bytes (3K slots)
- ........... Chunk Maps = 12K bytes
- ........... Miscellaneous = 130144 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.
[sql] view plaincopyprint?- SQL> execute dbms_result_cache.flush;
- PL/SQL procedure successfully completed.
- SQL> execute dbms_result_cache.memory_report(true);
- 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 = 0 bytes
- Maximum Cache Size = 0 bytes (0 blocks)
- Maximum Result Size = 0 bytes (0 blocks)
- [Memory]
- Total Memory = 5352 bytes [0.004% of the Shared Pool]
- ... Fixed Memory = 5352 bytes [0.004% of the Shared Pool]
- ....... Memory Mgr = 200 bytes
- ....... Cache Mgr = 208 bytes
- ....... Bloom Fltr = 2K bytes
- ....... State Objs = 2896 bytes
- ... Dynamic Memory = 0 bytes [0.000% of the Shared Pool]
- PL/SQL procedure successfully completed.
- SQL>
oracle 11g 之 result cache相关推荐
- [20190214]11g Query Result Cache RC Latches.txt
[20190214]11g Query Result Cache RC Latches.txt --//昨天我重复链接http://www.pythian.com/blog/oracle-11g-qu ...
- oracle 结果缓存,Result cache结果缓存
结果缓存 结果缓存默认是可以开启的 , 可以通过下面的方式查询其是否开启 SQL> SQL> show parameter RESULT_CACHE_MAX_SIZE NAME ...
- Oracle结果集缓存(Result Cache)--服务器、客户端、函数缓存
Oracle结果集缓存(Result Cache)--服务器.客户端.函数缓存 在11g中,Oracle提供了结果集缓存特性.该缓存是在共享内存中存储全部的结果集,如果一个查询SQL被执行,且它对应的 ...
- Oracle 11g 新特性简介
Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(Informat ...
- Oracle 11g新特性
Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(Informat ...
- 【】oracle 11g 新特性
Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(Informat ...
- oracle 11g 新特性
2019独角兽企业重金招聘Python工程师标准>>> Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的 ...
- oracle 11g 新特性详解
Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(Informat ...
- oracle 11g 新特性1
racle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(Informati ...
最新文章
- .NET判断字符串是否是数值型或xxx型
- 上帝视角任意切换:三维重建和图像渲染是怎么结合的?
- 15个最佳的代码评审(Code Review)工具
- 【移动通信】多址技术和调制技术
- 数据科学竞赛-自然语言处理赛流程
- Android开发-Hello World+phonegap(Cordova)
- 【高校宿舍管理系统】第十章 缺勤管理、报修管理、来访人员管理以及公告管理
- 最后的战线java下载_最后战线2.0游戏
- HALCON:Variation Model用法解析
- 推荐5款常用编程文本编辑器
- ES3~ES6数组的方法总结
- DP9637汽车故障诊断仪的原理与作用
- 木马是如何编写的(一)
- 小米笔记本 wifi 频繁断开重连 解决方案
- 恒生电子工作、学习经验总结#3
- pycharm汉化之后切换回英文
- 用仿ActionScript的语法来编写html5——第二篇,利用Sprite来实现动画
- 关于OSCE 的安装部署视频教程
- 《基于机器视觉的输电线路交叉点在线测量方法及技术方案》论文笔记
- 关于MAC下pymysql连接mysql数据库报错2003的问题解决方法