Oracle 12c Result Cache详解

Oracle 12c 以SH用户登录系统,执行一个简单的查询:

注意在执行计划中出现了:RESULT CACHE

SQL> SELECT COUNT(*)
  2  FROM sales
  3  WHERE AMOUNT_SOLD =
  4    ( SELECT MIN(AMOUNT_SOLD) FROM sales
  5    );

  COUNT(*)
----------
        38

已用时间:  00: 00: 02.34

执行计划
----------------------------------------------------------
Plan hash value: 353223879

-----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name                       | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |                            |     1 |     5 |  1043   (3)| 00:00:01 |       |       |
|   1 |  RESULT CACHE            | 638dzksdy77tj25m4rq4mvdmdx |       |       |            |          |       |       |
|   2 |   SORT AGGREGATE         |                            |     1 |     5 |            |          |       |       |
|   3 |    PARTITION RANGE ALL   |                            |   256 |  1280 |   523   (3)| 00:00:01 |     1 |    28 |
|*  4 |     TABLE ACCESS FULL    | SALES                      |   256 |  1280 |   523   (3)| 00:00:01 |     1 |    28 |
|   5 |      SORT AGGREGATE      |                            |     1 |     5 |            |          |       |       |
|   6 |       PARTITION RANGE ALL|                            |   918K|  4486K|   521   (3)| 00:00:01 |     1 |    28 |
|   7 |        TABLE ACCESS FULL | SALES                      |   918K|  4486K|   521   (3)| 00:00:01 |     1 |    28 |
-----------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - filter("AMOUNT_SOLD"= (SELECT MIN("AMOUNT_SOLD") FROM "SALES" "SALES"))

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

   1 - column-count=1; type=AUTO; dependencies=(SH.SALES); attributes=(single-row); name="SELECT COUNT(*)
FROM sales
WHERE AMOUNT_SOLD =
  ( SELECT MIN(AMOUNT_SOLD) FROM sales
  )"


Note
-----
   - SQL plan baseline "SQL_PLAN_cstmbjapmzq3wb8285edf" used for this statement


统计信息
----------------------------------------------------------
       3201  recursive calls
        132  db block gets
       8857  consistent gets
       1851  physical reads
      13044  redo size
        550  bytes sent via SQL*Net to client
        607  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
        370  sorts (memory)
          0  sorts (disk)
          1  rows processed

以SYS用户连接到PDB后,查看关于Result Cache的初始化参数设置:

SQL> show parameter result;

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            12384K
result_cache_mode                    string                 AUTO
result_cache_remote_expiration       integer                0

可以看到 result_cache_mode默认值为:AUTO

结果集缓存(Result Cache)是共享全局区域(SGA)或客户端应用程序内存中的一个内存区域,用于存储数据库查询或查询块的结果以便重用。缓存的行在SQL语句和会话之间共享,除非它们变得过时。

可以分为:

  • Server Result Cache:服务器结果缓存是共享池内的内存池。这个内存池由SQL查询结果缓存(存储SQL查询的结果)和PL/SQL函数结果缓存(存储PL/SQL函数返回的值)组成。
  • Client Result Cache:Oracle Call Interface(OCI)客户机结果缓存是客户机进程内的一个内存区域,用于缓存OCI应用程序的SQL查询结果集。此客户端缓存存在于每个客户端进程中,并由进程内的所有会话共享。Oracle建议对只读或读取多表的查询进行客户端结果缓存。 

客户端结果缓存与驻留在SGA中的服务器结果缓存不同。当启用客户端结果缓存时,可以将查询结果集缓存在客户端、服务器或两者上。即使服务器结果缓存被禁用,也可以启用客户端缓存。

服务器端 Result Cache是如何工作的?

当查询执行时,数据库搜索缓存内存,以确定结果是否存在于结果缓存中。如果结果存在,则数据库从内存中检索结果,而不是执行查询。如果没有缓存结果,则数据库执行查询,将结果作为输出返回,并将结果存储在结果缓存中。

当用户重复执行查询和函数时,数据库从缓存中检索行,从而减少响应时间。当依赖数据库对象中的数据被修改时,缓存结果变得无效。

在HR用户下,执行下面的查询语句:

注意,使用了 /*+ RESULT_CACHE */ Hints提示,通过查看执行计划,可以看到,执行计划中产生了Result Cache。

Result Cache的ID为:36cy5bwyvd4bs1srpnt3yg1420。

SQL> SELECT /*+ RESULT_CACHE */ department_id, AVG(salary)
  2    FROM hr.employees
  3   GROUP BY department_id;

DEPARTMENT_ID AVG(SALARY)
------------- -----------
          100  8601.33333
           30        4150
                     7000
           20        9500
           70       10000
           90  19333.3333
          110       10154
           50  3475.55556
           40        6500
           80  8955.88235
           10        4400
           60        5760

已选择 12 行。

已用时间:  00: 00: 00.54

执行计划
----------------------------------------------------------
Plan hash value: 1192169904

--------------------------------------------------------------------------------------------------
| Id  | Operation           | Name                       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |                            |    11 |    77 |     4  (25)| 00:00:01 |
|   1 |  RESULT CACHE       | 36cy5bwyvd4bs1srpnt3yg1420 |       |       |            |          |
|   2 |   HASH GROUP BY     |                            |    11 |    77 |     4  (25)| 00:00:01 |
|   3 |    TABLE ACCESS F
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值