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