结果集缓存(Result Cache)是Oracle Database 11g新引入的功能,除了可以在服务器端缓存结果集(Server Result Cache)之外,还可以在客户端缓存结果集(Client Result Cache)。下面着重介绍一下服务器端结果集缓存。

服务器端的Result Cache Memorey由两部分组成。
·SQL Query Result Cache:存储SQL查询的结果集。
·PL/SQL Function Result Cache:用于存储PL/SQL函数的结果集。

Oracle 通过一个新引入的初始化参数result_cache_max_size来控制该Cache的大小。如果result_cache_max_size=0则表示禁用该特性。参数result_cache_max_result则控制单个缓存结果可以占总的Server Result Cache大小的百分比。

tq@CCDB> select * from v$version where rownum < 2;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production

tq@CCDB> show parameter result_cache
NAME                                 TYPE                 VALUE
------------------------------------ -------------------- ---------------
client_result_cache_lag              big integer          3000
client_result_cache_size             big integer          0
result_cache_max_result              integer              5
result_cache_max_size                big integer          2080K
result_cache_mode                    string               MANUAL
result_cache_remote_expiration       integer              0

上面显示的参数中result_cache_mode用于控制Server Result cache的模式,该参数有3个可选设置。
·设置auto:则优化器会自动判断是否将查询结果缓存。
·设置manual:则需要通过查询提示result_cache来告诉优化器是否缓存结果。
·设置force:则尽可能地缓存查询结果(通过提示no_result_cache可以拒绝缓存)。

下面通过测试来看一下这一新特性的使用及优势所在,首先创建一张测试表:

tq@CCDB> create table dbtan as select * from dba_objects;
Table created.

在以前的版本中,第一次执行该SQL可以看到consistent gets和physical reads大致相同:

tq@CCDB> set autotrace on
tq@CCDB> select count(*) from dbtan;
  COUNT(*)
----------
     70439
Statistics
----------------------------------------------------------
         28  recursive calls
          0  db block gets
      1119  consistent gets
       1036  physical reads

再次执行同样查询时,由于数据Cache在内存中,physical reads会减少到0,但是consistent gets很难降低:

tq@CCDB> select count(*) from dbtan;
  COUNT(*)
----------
     70439
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       1041  consistent gets
          0  physical reads

现在再来看看在Server Result Cache下Oracle的行为,首先在result_cache_mode参数设置为MANUAL时:

tq@CCDB> show parameter result_cache_mode
NAME                                 TYPE                 VALUE
------------------------------------ -------------------- -----------------
result_cache_mode                    string               MANUAL

需要在SQL语句中手工指定Cache,这需要通过加入一个hints来实现,这个hints是result_cache:

tq@CCDB> select/*+ result_cache */count(*) from dbtan;
  COUNT(*)
----------
     70439
Execution Plan
----------------------------------------------------------
Plan hash value: 1782547706

------------------------------------------------------------------------------------------
| Id  | Operation           | Name                       | Rows  | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |                            |     1 |   290   (1)| 00:00:04 |
|   1 |  RESULT CACHE       |g6tx53yfbxr2fah44y3vvdp4hc|       |            |          |
|   2 |   SORT AGGREGATE    |                            |     1 |            |          |
|   3 |    TABLE ACCESS FULL| DBTAN                      | 78689 |   290   (1)| 00:00:04 |
------------------------------------------------------------------------------------------
Result Cache Information (identified by operation id):
------------------------------------------------------
   1 - column-count=1; dependencies=(TQ.DBTAN); attributes=(single-row); name="select/*+ result_cache */count(*) from dbtan"
Statistics
----------------------------------------------------------
          4  recursive calls
          0  db block gets
       1117  consistent gets
          0  physical reads

注意到这个执行计划已经和以往的不同,RESULT CACHE以g6tx53yfbxr2fah44y3vvdp4hc名称创建。那么在接下来的查询中,这个Result Cache就可以被利用:

tq@CCDB> select /*+ result_cache */ count(*) from dbtan;
  COUNT(*)
----------
     70439
Execution Plan
----------------------------------------------------------
Plan hash value: 1782547706

------------------------------------------------------------------------------------------
| Id  | Operation           | Name                       | Rows  | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |                            |     1 |   290   (1)| 00:00:04 |
|   1 |  RESULT CACHE       |g6tx53yfbxr2fah44y3vvdp4hc|       |            |          |
|   2 |   SORT AGGREGATE    |                            |     1 |            |          |
|   3 |    TABLE ACCESS FULL| DBTAN                      | 78689 |   290   (1)| 00:00:04 |
------------------------------------------------------------------------------------------
Result Cache Information (identified by operation id):
------------------------------------------------------

1 - column-count=1; dependencies=(TQ.DBTAN); attributes=(single-row); name="select /*+ result_cache */ count(*) from dbtan"

Note
-----
   - dynamic sampling used for this statement
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          0  consistent gets
          0  physical reads
          0  redo size

在这个利用到Result Cache的查询中,consistent gets减少到0,直接访问结果集,不再需要执行SQL查询。这就是Result Cache的强大之处。

在以上的测试中,当result_cache_mode设置为MANUAL时,只有使用hints的情况下,Oracle才会利用缓存结果集;而如果将result_cache_mode设置为AUTO,Oracle如果发现缓冲结果集已经存在,那么就会自动使用。但是如果缓冲结果集不存在,Oracle并不会自动进行缓冲,只有使用HINTS的情况下,Oracle才会将执行的结果集缓存。

可以通过查询v$result_cache_memory视图来看Cache的使用情况:

tq@CCDB> select * from v$result_cache_memory where free='NO';

ID      CHUNK     OFFSET FREE    OBJECT_ID   POSITION
---------- ---------- ---------- ------ ---------- ----------
         0          0          0 NO              0          0
         1          0          1 NO              1          0
         2          0          2 NO              2          0
         3          0          3 NO              3          0

通过V$RESULT_CACHE_STATISTICS可以查询Result Cache的统计信息:

tq@CCDB> select * from v$result_cache_statistics;

ID NAME                                             VALUE
---------- ---------------------------------------- -------------
         1 Block Size (Bytes)                                1024
         2 Block Count Maximum                               2080
         3 Block Count Current                                 32
         4 Result Size Maximum (Blocks)                       104
         5 Create Count Success                                 2
         6 Create Count Failure                                 0
         7 Find Count                                           2
         8 Invalidation Count                                   1
         9 Delete Count Invalid                                 0
        10 Delete Count Valid                                   0

V$RESULT_CACHE_OBJECTS记录了Cache的对象:

tq@CCDB> select id,type,name,block_count,row_count from v$result_cache_objects;

ID TYPE            NAME                                           BLOCK_COUNT  ROW_COUNT
---------- --------------- ---------------------------------------------- ----------- ----------
         2 Dependency      TQ.DBTAN                                                 1          0
         0 Dependency      object-id(98106)                                         1          0
         3 Result          select /*+ result_cache */ count(*) from dbtan           1          1
         1 Result          select /*+ result_cache */ count(*) from t               1          1

一个新的系统包被引入,DBMS_RESULT_CACHE可以用于执行关于Result Cache的管理:

tq@CCDB> set serveroutput on
tq@CCDB> exec 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  = 2080K bytes (2080 blocks)
Maximum Result Size = 104K bytes (104 blocks)
[Memory]
Total Memory = 169352 bytes [0.045% of the Shared Pool]
... Fixed Memory = 5296 bytes [0.001% of the Shared Pool]
... Dynamic Memory = 164056 bytes [0.044% of the Shared Pool]
....... verhead = 131288 bytes
....... Cache Memory = 32K bytes (32 blocks)
........... Unused Memory = 28 blocks
........... Used Memory = 4 blocks
............... Dependencies = 2 blocks (2 count)
............... Results = 2 blocks
................... SQL     = 1 blocks (1 count)
................... Invalid = 1 blocks (1 count)

PL/SQL procedure successfully completed.

Oracle 11g新特性:Result Cache相关推荐

  1. Oracle 11g 新特性 -- Result Cache(结果高速缓存)

    Oracle 从11g开始引入了结果集缓存(result cache)的新特性,用于存储经常使用的SQL语句和函数的查询结果,将来语句再执行的时候,oracle直接的访问内存得到结果.其优点是重用相同 ...

  2. ORACLE 11g新特性中文版

    Oracle 11g 新特性 摘自ITPUB的love_zz的帖子 http://www.itpub.net/712880.html Oracle 11g 现在已经开始进行beta测试,预计在2007 ...

  3. Oracle 11g新特性之缓存与连接池

    Oracle 11g新特性之缓存与连接池 上一篇 /下一篇  2008-03-26 16:03:19 / 个人分类:Oracle 数据库 11g面向 DBA 和开发人员的重要新特性 查看( 414 ) ...

  4. Oracle 11g 新特性 -- Transparent Data Encryption (透明数据加密TDE) 增强 说明

    一.TransparentData Encryption (TDE:透明数据加密) 说明 Orace TDE 是Orcle 10R2中的一个新特性,其可以用来加密数据文件里的数据,保护从操作系统层面上 ...

  5. Oracle 11g 新特性 – HM(Hang Manager)简介

    在这篇文章中我们会对oracle 11g 新特性-hang 管理器(Hang Manager) 进行介绍.我们需要说明,HM 只在RAC 数据库中存在. 在我们诊断数据库问题的时候,经常会遇到一些数据 ...

  6. 11g awr oracle 系列_Oracle 11g AWR 系列七:Active Sessi...-Oracle 11G新特性(共36个)-父子节点问题_169IT.COM...

    Oracle 11G新特性(共36个) 一.数据库管理部分 ·      1. 数据库重演(Database Replay) 这一特性可以捕捉整个数据的负载,并且传递到一个从备份或者standby数据 ...

  7. Oracle 11g新特性之--虚拟列(Virtual Column)

    Oracle 11g新特性之--虚拟列(Virtual Column) Oracle 11G虚拟列Virtual Column介绍 在老的 Oracle 版本,当我们需要使用表达式或者一些计算公式时, ...

  8. Oracle 11g新特性之 - 使用RMAN复制数据库

    Oracle 11g新特性之 - 使用RMAN复制数据库 Oracle 11g新特性之 - 使用RMAN复制数据库 - 1 Oracle 11g新特性之 - 使用RMAN复制数据库 - 2 Oracl ...

  9. Oracle 11g新特性之--只读表(read only table)

    Oracle 11g新特性之--只读表(read only table)       Oracle11g推出了一个新的特性,可以将table置于read only状态,处于该状态的table的不能执行 ...

  10. oracle+字段+virtual,Oracle 11g新特性之--虚拟列(Virtual Column)

    Oracle 11g新特性之--虚拟列(Virtual Column) Oracle 11G虚拟列Virtual Column介绍 在老的 Oracle 版本,当我们需要使用表达式或者一些计算公式时, ...

最新文章

  1. 列举数据挖掘领域的十大挑战问题
  2. Wince C++串口编程
  3. C~K要找女朋友了!!!_JAVA
  4. 编译Qt“NMAKE:fatal error U1077”错误的解决方法
  5. 【数据结构与算法】之深入解析“基本计算器”的求解思路与算法示例
  6. [html] HTML采用的是RGB颜色还是CMYK颜色?为什么?
  7. 1299. 将每个元素替换为右侧最大元素
  8. Linux保护文件实现,Linux完整性保护机制模块实现分析(1)
  9. PL/SQL数据类型
  10. 我在使用Spring Gateway时遇到的一些坑
  11. Angr安装与使用之使用篇(五)
  12. 常见的5个Java测试框架和工具
  13. 如何解决飞秋FeiQ绑定端口错误
  14. 基于DNN的IMDB电影数据集文本分类
  15. 网络图怎么画?简单专业的网络图绘制方法
  16. 洛谷 P4643 [国家集训队]阿狸和桃子的游戏
  17. .[转] 全国主体功能区规划图
  18. php小程序餐馆点餐订餐外卖系统
  19. 安卓期末大作业——番茄小说APP
  20. 怎样把游戏从计算机卸载了,电脑桌面上的游戏怎么卸载,电脑桌面上的游戏怎么卸载?...

热门文章

  1. django ajax文件上传,django 之 ajax 篇 上传文件
  2. pyppeteer有java版本吗_Pyppeteer中文文档_序言_安装_基本使用及注意事项
  3. 分治法:关于选择算法,找最大,找最小,同时找最大和最小,找第二大
  4. c# 给文件/文件夹 管理用户权限
  5. 2019-3-15 模拟赛 T1
  6. (3)LoraWAN:链路控制、SF BW CR
  7. operator new和operator delete
  8. java常见异常总结---自己工作中经常遇到的一些异常
  9. s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录(一 硬件驱动层)
  10. echarts怎么控制一个点沿着折线移动_计算机怎么识别图像中的直线?