结果集缓存(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 新特性详解 #### 一、安装与配置 在 Oracle 11G 中,安装过程变得更加简化且易于管理。通过 Oracle Universal Installer (OUI) 安装 Oracle 11g 时,可以选择 OraInventory 目录进行安装。此外,在...
SQL Query Result Cache是Oracle 11g引入的一种性能优化新技术,旨在提高数据库系统的查询效率,减少不必要的计算和I/O操作。这一特性通过缓存SQL查询的结果来避免重复执行相同的查询,从而节省系统资源。 7.1 ...
Oracle数据库作为企业级应用的主流数据库管理系统,其11g版本是相当知名并且广泛使用的一个版本。Oracle 11g体系架构涉及许多核心组件和概念,下面将根据文档提供的内容详细解释这些知识点。 首先,Oracle 11g体系...
Oracle 11g 提供了一种新的技术,名为 Server Result Cache,用于显著提高查询速度,尤其是在处理大量数据和重复查询的场景下。该技术的核心在于能够缓存查询结果,使得后续相同的查询可以直接从缓存中获取结果,而...
Oracle 11g的推出,不仅提供了性能优化工具如Result Cache、SQL Plan Management等,还引入了如Cardinality Feedback、Database Replay等特性,极大地提升了数据库的运行效率和管理能力。此外,Oracle对旧版本的支持...
Oracle 11g在性能管理方面引入了一系列新特性,这些改进显著提升了数据库的性能和管理员的工作效率。本文将深入探讨其中的关键功能。 1. 结果缓存功能 (Result Caching Functionality) 1.1 概述 结果缓存是...
### Oracle 11g体系-全面详解 #### 第一部分 体系架构 ##### 第一章:实例与数据库 **1.1 Oracle基础架构及应用环境** Oracle 11g的架构设计旨在提供高效、稳定和安全的数据管理解决方案。该版本不仅在技术上...
4. Result Cache:负责管理查询结果的缓存。 5. Latches:负责管理共享资源的锁机制。 6. Reserved Pool:负责管理预留的共享内存池。 7. User Global Area (UGA):负责管理用户的会话信息。 8. Program Global Area...
4. **利用Oracle 11g的PL/SQL新特性**:如ResultCache功能可以改善用户体验,而改进的正则表达式功能则使得Web日志分析更加高效。 5. **数据迁移**:Oracle SQL Developer中的快速迁移功能帮助支付宝高效地将部分...
在Oracle 11g中引入了Result Cache,进一步优化了SQL查询的性能,它可以存储查询结果,当相同的查询再次执行时,可以直接从缓存中获取结果,减少数据库的处理负载。 6. **SQL解析与执行**:Oracle解析SQL语句后,...
### ITPUB电子期刊第十七期:聚焦Oracle数据库11g新特性 #### Oracle数据库11g概述 Oracle数据库11g是Oracle公司推出的全新一代数据库管理系统,它不仅继承了Oracle数据库系列的强大功能,还引入了一系列重要的...
4. **利用Oracle 11g新增的PL/SQL特性**:例如ResultCache功能改善了用户体验,改进后的正则表达式功能使Web日志分析变得更加便捷。 5. **快速迁移工具**:Oracle SQL Developer内置的快速迁移功能帮助支付宝将部分...
Understand and use new Oracle Database 11g features, including the edition-based redefinition capability, the function result cache, the new CONTINUE statement, fine-grained dependency tracking, ...
作为Oracle融合中间件的一部分,Oracle SOA套件11g通过集成Oracle服务总线11g,能够将复杂的、易碎的应用架构转变为灵活且易于调整的业务网络。Oracle服务总线11g以标准化的方式协调和管理服务及应用,提高了系统的...
Oracle 11g引入了Result Cache功能,进一步提升性能。Result Cache分为Server和Client两部分,允许缓存SQL查询的结果,避免重复计算,从而显著减少I/O操作和网络通信。 此外,书中还涉及了在瓶颈处寻找性能突破的...
Oracle Database 11g引入了一个专门用于结果缓存的区域——Server Result Cache。它位于SGA的Shared Pool中,与其他如数据字典缓存、库缓存等并存。通过调整参数RESULT_CACHE_MAX_SIZE,可以控制Server Result Cache...
最新的Oracle In Memory 版本引入了一些重要的新特性: - **星型模式和预先计算的KPI**:增强了对星型模型的支持,并允许预先计算关键性能指标(KPIs),从而提高仪表板性能。 - **写一次,读一次**:简化了数据...