`

Oracle result_cache

阅读更多

Oracle 11g新特性:Server Result Cache测试

现在我们来看一下Server Result Cache的作用。

首先创建一张测试表:

SQL> connect eygle/eygle
Connected.
SQL> create table eygle as select * from dba_objects;

Table created.


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

SQL> set autotrace on
SQL> select count(*) from eygle;

  COUNT(*)
----------
    15993


Execution Plan
----------------------------------------------------------
Plan hash value: 3602634261

--------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Cost (%CPU)| Time    |
--------------------------------------------------------------------
|  0 | SELECT STATEMENT  |      |    1 |    64  (0)| 00:00:01 |
|  1 |  SORT AGGREGATE    |      |    1 |            |          |
|  2 |  TABLE ACCESS FULL| EYGLE | 14489 |    64  (0)| 00:00:01 |
--------------------------------------------------------------------

Note
-----
  - dynamic sampling used for this statement


Statistics
----------------------------------------------------------
        28  recursive calls
          0  db block gets
        282  consistent gets
        217  physical reads
          0  redo size
        420  bytes sent via SQL*Net to client
        416  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed


再次执行同样查询时,由于数据Cache在内存中,physical reads会减少到0.
但是consistent gets仍然不变:

SQL> select count(*) from eygle;

  COUNT(*)
----------
    15993


Execution Plan
----------------------------------------------------------
Plan hash value: 3602634261

--------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Cost (%CPU)| Time    |
--------------------------------------------------------------------
|  0 | SELECT STATEMENT  |      |    1 |    64  (0)| 00:00:01 |
|  1 |  SORT AGGREGATE    |      |    1 |            |          |
|  2 |  TABLE ACCESS FULL| EYGLE | 14489 |    64  (0)| 00:00:01 |
--------------------------------------------------------------------

Note
-----
  - dynamic sampling used for this statement


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        221  consistent gets
          0  physical reads
          0  redo size
        420  bytes sent via SQL*Net to client
        416  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

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

SQL> show parameter result_cache_mode

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


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

SQL> select /*+ result_cache */ count(*) from eygle;

  COUNT(*)
----------
    15993


Execution Plan
----------------------------------------------------------
Plan hash value: 3602634261

------------------------------------------------------------------------------------------
| Id  | Operation          | Name                      | Rows  | Cost (%CPU)| Time    |
------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT    |                            |    1 |    64  (0)| 00:00:01 |
|  1 |  RESULT CACHE      | 76rwwyazv6t6c39f1d8rrqh8rb |      |            |          |
|  2 |  SORT AGGREGATE    |                            |    1 |            |          |
|  3 |    TABLE ACCESS FULL| EYGLE                      | 14489 |    64  (0)| 00:00:01 |
------------------------------------------------------------------------------------------

Result Cache Information (identified by operation id):
------------------------------------------------------

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


Note
-----
  - dynamic sampling used for this statement


Statistics
----------------------------------------------------------
          4  recursive calls
          0  db block gets
        280  consistent gets
          0  physical reads
          0  redo size
        420  bytes sent via SQL*Net to client
        416  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以76rwwyazv6t6c39f1d8rrqh8rb名称创建。

那么在接下来的查询中,这个Result Cache就可以被利用:

SQL> select /*+ result_cache */ count(*) from eygle;

  COUNT(*)
----------
    15993


Execution Plan
----------------------------------------------------------
Plan hash value: 3602634261

------------------------------------------------------------------------------------------
| Id  | Operation          | Name                      | Rows  | Cost (%CPU)| Time    |
------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT    |                            |    1 |    64  (0)| 00:00:01 |
|  1 |  RESULT CACHE      | 76rwwyazv6t6c39f1d8rrqh8rb |      |            |          |
|  2 |  SORT AGGREGATE    |                            |    1 |            |          |
|  3 |    TABLE ACCESS FULL| EYGLE                      | 14489 |    64  (0)| 00:00:01 |
------------------------------------------------------------------------------------------

Result Cache Information (identified by operation id):
------------------------------------------------------

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


Note
-----
  - dynamic sampling used for this statement


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          0  consistent gets
          0  physical reads
          0  redo size
        420  bytes sent via SQL*Net to client
        416  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的查询中,consistent gets减少到0,直接访问结果集,不再需要执行SQL查询。
这就是Result Cache的强大之处。

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

SQL> select * from V$RESULT_CACHE_MEMORY
  2  where FREE='NO';

        ID      CHUNK    OFFSET FRE  OBJECT_ID  POSITION
---------- ---------- ---------- --- ---------- ----------
        0          0          0 NO          0          0
        1          0          1 NO          1          0


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

SQL> select * from V$RESULT_CACHE_STATISTICS;

        ID NAME                                VALUE
---------- ------------------------------ ----------
        1 Block Size (Bytes)                  1024
        2 Block Count Maximum                  992
        3 Block Count Current                    32
        4 Result Size Maximum (Blocks)          49
        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

10 rows selected.


V$RESULT_CACHE_OBJECTS记录了Cache的对象:

SQL> SELECT ID,TYPE,NAME,BLOCK_COUNT,ROW_COUNT FROM V$RESULT_CACHE_OBJECTS; 

        ID TYPE      NAME                          BLOCK_COUNT  ROW_COUNT
---------- ---------- ------------------------------ ----------- ----------
        0 Dependency EYGLE.EYGLE                              1          0
        1 Result    select /*+ result_cache */ cou          1          1
                      nt(*) from eygle

一个新的系统包被引入,DBMS_RESULT_CACHE可以用于执行关于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  = 992K bytes (992 blocks)
Maximum Result Size = 49K bytes (49 blocks)
[Memory]
Total Memory = 100836 bytes [0.059% of the Shared Pool]
... Fixed Memory = 5132 bytes [0.003% of the Shared Pool]
... Dynamic Memory = 95704 bytes [0.056% of the Shared Pool]
....... Overhead = 62936 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.
分享到:
评论

相关推荐

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

    Oracle提供了动态性能视图如`V$RESULT_CACHE_METADATA`和`V$RESULT_CACHE_USAGE`来查看缓存状态。此外,可以使用`DBMS_RESULT_CACHE`包的函数和过程来手工清除或管理Result Cache。 7.4 Result Cache相关技术点 ...

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

    通过调整参数RESULT_CACHE_MAX_SIZE,可以控制Server Result Cache的大小。默认情况下,如果MEMORY_TARGET参数被设置,RESULT_CACHE_MAX_SIZE将自动调整为MEMORY_TARGET的0.25%。 为了调整结果缓存的大小,DBA可以...

    oracle 12c 常用操作命令

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

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

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

    ORACLE11G新特性

    此外,还可以使用 `result_cache_max_size` 参数控制结果缓存的最大大小。默认情况下,如果该值设置为 0,则表示禁用了结果缓存功能。可以通过查询 `v$sgastat` 视图来查看实际使用的大小。 为了查看结果缓存的状态...

    oracle19c快速部署..pdf

    8. 配置优化:文档最后提到了设置client_result_cache_size和result_cache_mode参数来调整结果集缓存。这通常对提升特定类型的应用程序性能非常关键,比如那些频繁执行查询的应用程序。 在部署过程中可能会遇到的...

    Oracle 11g体系-全面详解

    - **NoDefault Pool**: 包括db_nk_cache_size、db_keep_cache_size和db_recycle_cache_size等参数,用于指定不同类型的缓存空间。 - `db_nk_cache_size`: 指定非标准块大小内存空间,例如2k、4k、16k、32k。 - `...

    oracle11g体系架构学习文档

    非默认缓冲池由参数db_keep_cache_size、db_recycle_cache_size等管理不同类型的表空间。 3. 重做日志缓冲区(Redo Log Buffer):记录所有对数据库的修改信息,如DML和DDL操作,用于数据库恢复。重做日志缓冲区的...

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

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

    High Performance PL/SQL from Steven Feuerstein

    - 使用`PRAGMA RESULT_CACHE`来声明函数结果可被缓存。 - 使用`RESULT_CACHE`提示语句在函数内部标记结果缓存。 - **注意事项**:确保被缓存的函数不依赖于会变动的状态(如当前日期等)。 ##### 2. BULK COLLECT...

    oracle自定义函数总结

    RETURN NUMBER RESULT_CACHE RELIES_ON(emp) AS v_name emp.ename%TYPE; BEGIN SELECT ename INTO v_name FROM emp WHERE empno = no; RETURN v_name; END; ``` - **功能描述**:此函数使用了结果缓存特性...

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

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

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

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

    ORACLE读取FTP上的EXCEL文件

    CACHE => TRUE, DUR => DBMS_LOB.CALL); L_DEST_OFFSET := 1; L_SRC_OFFSET := 1; DBMS_LOB.OPEN(L_FILES, DBMS_LOB.LOB_READONLY); DBMS_LOB.LOADFROMFILE(L_RESULT, L_FILES, DBMS_LOB.LOBMAXSIZE); ...

Global site tag (gtag.js) - Google Analytics