`
阅读更多

Server result cache是在shared pool中为查询结果开辟一块专用的缓存,通过新引入的一个初始化参数来控制该cache的大小:result_cache_max_size。如果result_cache_max_size=0则表示禁用该特性。参数result_cache_max_result则控制单个缓存结果可以占总的Server result cache大小的百分比。另外还有一个初始化参数用于控制Server result cache的模式:result_cache_mode,如果取值为auto,则优化器会自动判断是否将查询结果缓存;如果取值为manual(这是默认值),则需要通过查询提示result_cache来告诉优化器是否缓存结果;如果取值为force,则系统会尽可能的缓存查询结果,当然,即使参数取值为force,也可以通过提示no_result_cache来拒绝缓存结果。在itpub关于该特性的讨论中,有人提到,文档中result_cache_mode只有manual/force两个取值。这个可能是文档的bug,通过给参数赋一个非法值得到的报错信息中明白的说明有三个取值:

SQL> alter session set result_cache_mode=a;
ERROR:
ORA-00096: invalid value A for parameter result_cache_mode, must be from among FORCE, MANUAL, AUTO 
 

Oracle11g还引入了一个package专门用于管理server result cache:dbms_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
 
    
分享到:
评论

相关推荐

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

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

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

    SQL&gt; ALTER SYSTEM SET result_cache_max_size = 2M SCOPE = MEMORY; System altered. ``` 之后,可以通过查询v$parameter视图来验证设置是否生效。 启用查询结果缓存,可以使用RESULT_CACHE_MODE初始化参数。该...

    Killtest 免费提供 1Z0-146 资料下载

    这是因为仅设置`result_cache_max_size`参数并不足以启用Result Cache,还需要确保其他相关参数如`result_cache_mode`设置正确。 ### 3. PL/SQL跟踪问题 #### 知识点详情: 题目描述了一个用户会话中启用PL/SQL...

    oracle 12c 常用操作命令

    oracle 12c 数据库常用操作语句,欢迎带走,如果可以 少给一点也行

    zf框架的zend_cache缓存使用方法(zend框架)

    if ($Result = $Cache-&gt;load('cache_two')) { echo "缓存已经存在! "; print_r($Result); } else { // 缓存不存在时的操作... } ``` - **写入缓存**:如果缓存不存在,可以通过 `save()` 方法保存数据到缓存...

    Python-rediscache一个Redis的缓存装饰器

    2. **缓存装饰器** 装饰器是Python编程中的一个重要概念,它允许我们修改或增强函数、类等对象的行为,而无需改变其源代码。在"Python-rediscache"中,装饰器用于在函数调用前检查是否有缓存结果,如果有则直接返回...

    mysql常用配置参数和状态变量

    7. Query_cache_limit:Query Cache 存放的单条 Query 最大 Result set(结果集),默认 1MB。 8. Qcache_free_memory:Query Cache 中目前剩余的内存大小。通过这个参数可以较为准确的观察出当前系统中的 Query ...

    Unity3D与微信小程序(游戏)交互

    id=165085824316781683968174&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-8-119605522.142^v9^pc_search_result_cache,157^v4^control&utm_term=...

    C++ vector用法及相应代码

    id=165045768816780271990904&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-3-82255984.142^v9^pc_search_result_cache,157^v4^control&utm_term=...

    PHP提交表单失败后如何保留填写的信息

    使用 session_cache_limiter 方法可能会出现的问题是,如果用户修改了已经提交的信息,表单页面所呈现的信息还是缓存里的信息,没能及时自动刷新。解决方案是,在 session_start 前面加上: `session_cache_limiter...

    对于mysql的query_cache认识的误区

    在`send_result_to_client`函数中,MySQL会检查SQL语句是否为SELECT,并且在`dispatch_command`函数中,会去除语句开始前的多余空格。这意味着在处理查询时,MySQL已经考虑到了前导空格的情况,并在解析查询之前将其...

    ORACLE11G新特性

    此外,还可以使用 `dbms_result_cache.status` 函数来检查结果缓存的状态,以及使用 `dbms_result_cache.memory_report` 函数来获取结果缓存的详细内存使用报告。 #### 六、ASM 权限管理 Oracle 11G 在 ASM ...

    IE.rar_IE_delphi list

    2. **定义结构体**:由于API函数使用特定的结构体,例如`INTERNET_CACHE_ENTRY_INFOA`,我们需要在Delphi代码中声明这些结构体。这个结构体包含了关于缓存条目的信息,如URL、文件名、大小和访问时间等。 3. **分配...

    Zend Framework 1.7.6 手册中文版

    #### 2. Zend_Acl **2.1 简介** - **访问控制列表(ACL)概念:** ACL是一种安全机制,用于定义不同用户对资源的不同访问权限。 - **资源(Resource)与角色(Role):** - **资源:** 可以是应用程序中的任何对象或...

    Python-johnnycachedjango应用缓存框架

    ### 2. johnny-cache简介 johnny-cache是一款针对Django设计的高性能缓存解决方案。它不仅提供了对Django内置缓存系统的增强,还引入了“脏”对象跟踪机制,自动检测并更新缓存中的过期数据。johnny-cache的主要...

    Oracle 11g体系-全面详解

    - **Result Cache**: 存储服务器端的SQL结果集及PL/SQL函数返回值。 - **User Global Area (UGA)**: 在共享服务器模式下,如果没有配置large pool,则UGA属于SGA的Shared Pool;在专用连接模式时,UGA属于PGA。 - *...

Global site tag (gtag.js) - Google Analytics