`

Oracle 11g新特性:Result Cache

阅读更多

Oracle Database 11g中,Oracle引入了一个令人关注的新特性:结果集缓存(Result Cache)。
顾名思义,这个新特性的含义就是将查询的结果集Cache起来,以便随后相同的查询请求可以直接利用,从而避免了再次查询。今天开始来学习一下这个新特性。

进一步的Result Cache又可以分为:Server Result Cache Client Result Cache
前者通过服务器端SGA来缓存结果集,后者通过客户端来缓存结果集。

缓存是提高性能的一个常用手段,可以说在Oracle数据库中,Cache无处不在
对于Client Result Cache:
在使用OCI应用程序时,可以通过客户端内存来缓存查询的结果集,缓存结果可以在所有session间共享,当查询反复执行时,查询结果可以直接从客户段的缓存中获得,从而极大地提高应用效率。
客户端结果集缓存并不使用服务器端的内存,不会对服务器的内存使用造成影响,这一点和Server Result Cache不同。
Client Result Cache相关的视图主要有:

SQL> select * from dict where table_name like '%CLIENT_RESULT_CACHE%';

TABLE_NAME                    COMMENTS
------------------------------ ---------------------------------------------
CLIENT_RESULT_CACHE_STATS$    Synonym for CRCSTATS_$
GV$CLIENT_RESULT_CACHE_STATS  Synonym for GV_$CLIENT_RESULT_CACHE_STATS
V$CLIENT_RESULT_CACHE_STATS    Synonym for V_$CLIENT_RESULT_CACHE_STATS

Client Result Cache相关的参数有:

SQL> show parameter client_result

NAME                                TYPE        VALUE
------------------------------------ ----------- ------------------------------
client_result_cache_lag              big integer 3000
client_result_cache_size            big integer 0

如果我们不想启用Client Result Cache的特性,可以设置参数client_result_cache_size0即可。

对于Server Result Cache:
服务器端结果集缓存使用Shared Pool中的内存来进行结果缓存,这部分内存使用可以通过v$sgastat视图来查询观察:

SQL> select * from v$sgastat
  2  where lower(name) like '%result%';

POOL        NAME                            BYTES
------------ -------------------------- ----------
shared pool  Result Cache: State Objs        2852
shared pool  Result Cache: Memory Mgr          124
shared pool  Result Cache: Bloom Fltr        2048
shared pool  Result Cache: Cache Mgr          108


进一步的和Result Cache相关的视图有:

SQL> select * from dict where table_name like '%RESULT_CACHE%';

TABLE_NAME                    COMMENTS
------------------------------ ---------------------------------------------
CLIENT_RESULT_CACHE_STATS$    Synonym for CRCSTATS_$
GV$CLIENT_RESULT_CACHE_STATS  Synonym for GV_$CLIENT_RESULT_CACHE_STATS
GV$RESULT_CACHE_DEPENDENCY    Synonym for GV_$RESULT_CACHE_DEPENDENCY
GV$RESULT_CACHE_MEMORY        Synonym for GV_$RESULT_CACHE_MEMORY
GV$RESULT_CACHE_OBJECTS        Synonym for GV_$RESULT_CACHE_OBJECTS
GV$RESULT_CACHE_STATISTICS    Synonym for GV_$RESULT_CACHE_STATISTICS
V$CLIENT_RESULT_CACHE_STATS    Synonym for V_$CLIENT_RESULT_CACHE_STATS
V$RESULT_CACHE_DEPENDENCY      Synonym for V_$RESULT_CACHE_DEPENDENCY
V$RESULT_CACHE_MEMORY          Synonym for V_$RESULT_CACHE_MEMORY
V$RESULT_CACHE_OBJECTS        Synonym for V_$RESULT_CACHE_OBJECTS
V$RESULT_CACHE_STATISTICS      Synonym for V_$RESULT_CACHE_STATISTICS

11 rows selected.


相关的参数主要有:

SQL> show parameter result_cache_max

NAME                                TYPE        VALUE
------------------------------------ ----------- ------------------------------
result_cache_max_result              integer    5
result_cache_max_size                big integer 992K


类似的,result_cache_max_size参数可以被看作Server Result Cache的一个开关,如果设置为0,则Server Result Cache功能会被禁用。而result_cache_max_result则用于定义每个Cache结果集能够使用的Result Cache的百分比。

参数result_cache_mode用于控制Server Result Cache的方式,该参数有3个选项:ManualAUTOForce

SQL> show parameter result_cache_mo     

NAME                                TYPE        VALUE
------------------------------------ ----------- ------------------------------
result_cache_mode                    string      MANUAL

Oracle11g还引入了一个package专门用于管理server result cachedbms_result_cache

清空server result cache

SQL> exec dbms_result_cache.flush
 
PL/SQL procedure successfully completed.

查看server result cache的内存使用报告

SQL> set serveroutput on
SQL> 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  = 1184K bytes (1184 blocks)
Maximum Result Size = 59K bytes (59 blocks)
[Memory]
Total Memory = 5132 bytes [0.006% of the Shared Pool]
... Fixed Memory = 5132 bytes [0.006% of the Shared Pool]
... Dynamic Memory = 0 bytes [0.000% of the Shared Pool]
 
PL/SQL procedure successfully completed.

通过动态性能视图v$result_cache_statistics可以知道server result cache的使用统计信息。

SQL> select * from v$result_cache_statistics;
 
        ID NAME                                VALUE
---------- ------------------------------ ----------
         1 Block Size (Bytes)                   1024
         2 Block Count Maximum                  1184
         3 Block Count Current                     0
         4 Result Size Maximum (Blocks)           59
         5 Create Count Success                    0
         6 Create Count Failure                    0
         7 Find Count                              0
         8 Invalidation Count                      0
         9 Delete Count Invalid                    0
        10 Delete Count Valid                      0
 
10 rows selected.

其他相关动态性能视图:
v$result_cache_objects
v$result_cache_memory
v$result_cache_dependency

下面我们看一个实际的例子

SQL> set autotrace on
SQL> select /*+ result_cache */ count(*) from test;
 
  COUNT(*)
----------
     11865
 
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=48 Card=1)
   1    0   RESULT CACHE OF '7rkq2h8sb7kdg5sjxw69z8c45g'
   2    1     SORT (AGGREGATE)
   3    2       TABLE ACCESS (FULL) OF 'TEST' (TABLE) (Cost=48 Card=12024)
 
Statistics
----------------------------------------------------------
        337  recursive calls
          0  db block gets
        291  consistent gets
          0  physical reads
          0  redo size
        352  bytes sent via SQL*Net to client
        500  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          5  sorts (memory)
          0  sorts (disk)
          1  rows processed

注意到执行计划中的RESULT CACHE OF ‘7rkq2h8sb7kdg5sjxw69z8c45g’,说明已经缓存前面两步的结果。

再来看result cache的内存使用情况

SQL> 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  = 1184K bytes (1184 blocks)
Maximum Result Size = 59K bytes (59 blocks)
[Memory]
Total Memory = 103528 bytes [0.112% of the Shared Pool]
... Fixed Memory = 5132 bytes [0.006% of the Shared Pool]
... Dynamic Memory = 98396 bytes [0.107% of the Shared Pool]
....... Overhead = 65628 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.

查看v$result_cache_statistics

SQL> select * from v$result_cache_statistics;
 
        ID NAME                                VALUE
---------- ------------------------------ ----------
         1 Block Size (Bytes)                   1024
         2 Block Count Maximum                  1184
         3 Block Count Current                    32
         4 Result Size Maximum (Blocks)           59
         5 Create Count Success                    1
         6 Create Count Failure                    0
         7 Find Count                              0
         8 Invalidation Count                      0
         9 Delete Count Invalid                    0
        10 Delete Count Valid                      0

注意到Create Count Success=1说明成功的缓存了一笔记录

再次执行该查询

SQL> select /*+ result_cache */ count(*) from test;
 
  COUNT(*)
----------
     11865
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=48 Card=1)
   1    0   RESULT CACHE OF '7rkq2h8sb7kdg5sjxw69z8c45g'
   2    1     SORT (AGGREGATE)
   3    2       TABLE ACCESS (FULL) OF 'TEST' (TABLE) (Cost=48 Card=12024)
 
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          0  consistent gets
          0  physical reads
          0  redo size
        352  bytes sent via SQL*Net to client
        500  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

注意到这里consistent gets=0,也就是该查询甚至不产生逻辑读了,也就是直接从result cache中获得了查询结果。

查看v$result_cache_statistics

SQL> select * from v$result_cache_statistics;
        ID NAME                                VALUE
---------- ------------------------------ ----------
         1 Block Size (Bytes)                   1024
         2 Block Count Maximum                  1184
         3 Block Count Current                    32
         4 Result Size Maximum (Blocks)           59
         5 Create Count Success                    1
         6 Create Count Failure                    0
         7 Find Count                              1
         8 Invalidation Count                      0
         9 Delete Count Invalid                    0
        10 Delete Count Valid                      0

注意到Find Count = 1,说明上次缓存的结果被后续的查询应用了一次。如果继续执行该查询,可以发现该统计信息相应增加。

当然,这个例子中,缓存了整个查询的结果,实际上也可以缓存执行计划中某一步或者某几步的查询结果。例如,下面的例子中,就缓存了子查询的结果

SQL> select count(*) from (select /*+result_cache*/* from test where object_id<100);
  COUNT(*)
----------
        98
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=48 Card=1)
   1    0   SORT (AGGREGATE)
   2    1     VIEW (Cost=48 Card=237)
   3    2       RESULT CACHE OF 'fbbc5y53mwuj75buth9d2vwkkn'
   4    3         TABLE ACCESS (FULL) OF 'TEST' (TABLE) (Cost=48 Card=237 Bytes=37446)
 
Statistics
----------------------------------------------------------
        716  recursive calls
          4  db block gets
        403  consistent gets
          0  physical reads
          0  redo size
        350  bytes sent via SQL*Net to client
        500  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
         23  sorts (memory)
          0  sorts (disk)
          1  rows processed
 
SQL> select count(*) from (select /*+result_cache*/* from test where object_id<100);
 
  COUNT(*)
----------
        98
 
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=48 Card=1)
   1    0   SORT (AGGREGATE)
   2    1     VIEW (Cost=48 Card=237)
   3    2       RESULT CACHE OF 'fbbc5y53mwuj75buth9d2vwkkn'
   4    3         TABLE ACCESS (FULL) OF 'TEST' (TABLE) (Cost=48 Card=237 Bytes=37446)
 
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          0  consistent gets
          0  physical reads
          0  redo size
        350  bytes sent via SQL*Net to client
        500  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

 

 

 

参考Metalink: SQL Query Result Cache

A separate shared memory pool is now used for storing and retrieving cached results. Query retrieval from the query result cache is faster than rerunning the query. Frequently executed queries will see performance improvements when using the query result cache.

The new query result cache enables explicit caching of results in database memory. Subsequent queries using the cached results will experience significant performance improvements.

Enable Result Caching :

You can set the RESULT_CACHE_MODE initialization parameter to control whether the SQL query result cache is used for all queries (when possible).

This parameter can be set at the system, session, or table level to the following values:

MANUAL - The results of a query can only be stored in the result cache by using the result_cache hint.
FORCE - All results are stored in the result cache.

Example:
If the RESULT_CACHE_MODE parameter is set to MANUAL then you must explicitly use the /*+ result_cache */ hint in your query to store the results of a query in the result cache.

SELECT /*+ result_cache */ deptno, avg(sal)
FROM emp
GROUP BY deptno;


If the RESULT_CACHE_MODE parameter is set to FORCE, and you do not wish to include the result of the query in the result cache, then you must use the /*+ no_result_cache */ hint in your query.

SELECT /*+ no_result_cache */ deptno, avg(sal)
FROM emp
GROUP BY deptno;


The database automatically invalidates a cached result whenever a transaction modifies the data or metadata of any of the database objects used to construct that cached result.

分享到:
评论

相关推荐

    ORACLE11G新特性

    ### ORACLE 11G 新特性详解 #### 一、安装与配置 在 Oracle 11G 中,安装过程变得更加简化且易于管理。通过 Oracle Universal Installer (OUI) 安装 Oracle 11g 时,可以选择 OraInventory 目录进行安装。此外,在...

    SHOUG文档分享-11g性能优化新技术-SQL-Query-Result-Cache-SHOUG成员罗敏1

    SQL Query Result Cache是Oracle 11g引入的一种性能优化新技术,旨在提高数据库系统的查询效率,减少不必要的计算和I/O操作。这一特性通过缓存SQL查询的结果来避免重复执行相同的查询,从而节省系统资源。 7.1 ...

    oracle11g体系架构学习文档

    Oracle数据库作为企业级应用的主流数据库管理系统,其11g版本是相当知名并且广泛使用的一个版本。Oracle 11g体系架构涉及许多核心组件和概念,下面将根据文档提供的内容详细解释这些知识点。 首先,Oracle 11g体系...

    Oracle11g中一种提高查询速度的新技术.pdf

    Oracle 11g 提供了一种新的技术,名为 Server Result Cache,用于显著提高查询速度,尤其是在处理大量数据和重复查询的场景下。该技术的核心在于能够缓存查询结果,使得后续相同的查询可以直接从缓存中获取结果,而...

    Minimal Downtime Oracle 11g Upgrade

    Oracle 11g的推出,不仅提供了性能优化工具如Result Cache、SQL Plan Management等,还引入了如Cardinality Feedback、Database Replay等特性,极大地提升了数据库的运行效率和管理能力。此外,Oracle对旧版本的支持...

    New features in Performance Management of Oracle 11g

    Oracle 11g在性能管理方面引入了一系列新特性,这些改进显著提升了数据库的性能和管理员的工作效率。本文将深入探讨其中的关键功能。 1. 结果缓存功能 (Result Caching Functionality) 1.1 概述 结果缓存是...

    Oracle 11g体系-全面详解

    ### Oracle 11g体系-全面详解 #### 第一部分 体系架构 ##### 第一章:实例与数据库 **1.1 Oracle基础架构及应用环境** Oracle 11g的架构设计旨在提供高效、稳定和安全的数据管理解决方案。该版本不仅在技术上...

    Oracle 12c完整后台进程&内存结构图 DBA必备

    4. Result Cache:负责管理查询结果的缓存。 5. Latches:负责管理共享资源的锁机制。 6. Reserved Pool:负责管理预留的共享内存池。 7. User Global Area (UGA):负责管理用户的会话信息。 8. Program Global Area...

    oracle资料

    4. **利用Oracle 11g的PL/SQL新特性**:如ResultCache功能可以改善用户体验,而改进的正则表达式功能则使得Web日志分析更加高效。 5. **数据迁移**:Oracle SQL Developer中的快速迁移功能帮助支付宝高效地将部分...

    oracle内存管理,深入浅出oracle内存管理,盖国强oracleppt

    在Oracle 11g中引入了Result Cache,进一步优化了SQL查询的性能,它可以存储查询结果,当相同的查询再次执行时,可以直接从缓存中获取结果,减少数据库的处理负载。 6. **SQL解析与执行**:Oracle解析SQL语句后,...

    ITPUB电子期刊第十七期

    ### ITPUB电子期刊第十七期:聚焦Oracle数据库11g新特性 #### Oracle数据库11g概述 Oracle数据库11g是Oracle公司推出的全新一代数据库管理系统,它不仅继承了Oracle数据库系列的强大功能,还引入了一系列重要的...

    支付宝(中国)网络技术有限公司使用甲骨文数据库11g技术构建和开发数据分析平台

    4. **利用Oracle 11g新增的PL/SQL特性**:例如ResultCache功能改善了用户体验,改进后的正则表达式功能使Web日志分析变得更加便捷。 5. **快速迁移工具**:Oracle SQL Developer内置的快速迁移功能帮助支付宝将部分...

    oracle-pl-sql-programming-5th-edition

    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 SOA套件11g升级版.pdf

    作为Oracle融合中间件的一部分,Oracle SOA套件11g通过集成Oracle服务总线11g,能够将复杂的、易碎的应用架构转变为灵活且易于调整的业务网络。Oracle服务总线11g以标准化的方式协调和管理服务及应用,提高了系统的...

    深入解析Oracle-数据库架构设计与性能优化实践

    Oracle 11g引入了Result Cache功能,进一步提升性能。Result Cache分为Server和Client两部分,允许缓存SQL查询的结果,避免重复计算,从而显著减少I/O操作和网络通信。 此外,书中还涉及了在瓶颈处寻找性能突破的...

    用缓存改善性能 页PPT学习教案.pptx

    Oracle Database 11g引入了一个专门用于结果缓存的区域——Server Result Cache。它位于SGA的Shared Pool中,与其他如数据字典缓存、库缓存等并存。通过调整参数RESULT_CACHE_MAX_SIZE,可以控制Server Result Cache...

    Oracle In Memory技术最佳实践.pdf

    最新的Oracle In Memory 版本引入了一些重要的新特性: - **星型模式和预先计算的KPI**:增强了对星型模型的支持,并允许预先计算关键性能指标(KPIs),从而提高仪表板性能。 - **写一次,读一次**:简化了数据...

Global site tag (gtag.js) - Google Analytics