oracle result_cache

result_cache

oracle在sga的shared_pool内存中专门开辟了一个result cache内存结构,当第一个会话查询时会先从磁盘取数据,同时将结果放在shared_pool中的result cache中,第二个回话相同的sql查询时会直接从result cache中读取数据,极大的提升了查询的性能

测试:

--不使用result_cache两次查询

SQL> alter system flush shared_pool;

System altered.

SQL> alter system flush buffer_cache;

System altered.
SQL>  select deptno, avg(sal) from emp group by deptno;

    DEPTNO   AVG(SAL)
---------- ----------
        30 1566.66667
        20       2175
        10 2916.66667

Execution Plan
----------------------------------------------------------
Plan hash value: 4067220884

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     3 |    21 |     4  (25)| 00:00:01 |
|   1 |  HASH GROUP BY     |      |     3 |    21 |     4  (25)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP  |    14 |    98 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------

Statistics
----------------------------------------------------------
         11  recursive calls
          0  db block gets
         14  consistent gets
          3  physical reads
          0  redo size
        704  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          3  rows processed
SQL> select deptno, avg(sal) from emp group by deptno;

    DEPTNO   AVG(SAL)
---------- ----------
        30 1566.66667
        20       2175
        10 2916.66667

Execution Plan
----------------------------------------------------------
Plan hash value: 4067220884

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     3 |    21 |     4  (25)| 00:00:01 |
|   1 |  HASH GROUP BY     |      |     3 |    21 |     4  (25)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP  |    14 |    98 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------

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

--使用result_cache两次查询结果

SQL> alter system flush shared_pool;

System altered.

SQL> alter system flush buffer_cache;

System altered.

SQL> 

		  
select /*+ result_cache */ deptno, avg(sal) from emp
 group by deptno;
SQL> select /*+ result_cache */ deptno, avg(sal) from emp
  2   group by deptno;

    DEPTNO   AVG(SAL)
---------- ----------
        30 1566.66667
        20       2175
        10 2916.66667

Execution Plan
----------------------------------------------------------
Plan hash value: 4067220884

--------------------------------------------------------------------------------------------------
| Id  | Operation           | Name                       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |                            |     3 |    21 |     4  (25)| 00:00:01 |
|   1 |  RESULT CACHE       | 69cmubna179r6gh0sd1y59kbqz |       |       |            |          |
|   2 |   HASH GROUP BY     |                            |     3 |    21 |     4  (25)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| EMP                        |    14 |    98 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------

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

   1 - column-count=2; dependencies=(SCOTT.EMP); name="select /*+ result_cache */ deptno, avg(sal) from emp
 group by deptno"

Statistics
----------------------------------------------------------
         64  recursive calls
          0  db block gets
         53  consistent gets
         14  physical reads
          0  redo size
        704  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          7  sorts (memory)
          0  sorts (disk)
          3  rows processed

SQL> select /*+ result_cache */ deptno, avg(sal) from emp
  2   group by deptno;

    DEPTNO   AVG(SAL)
---------- ----------
        30 1566.66667
        20       2175
        10 2916.66667

Execution Plan
----------------------------------------------------------
Plan hash value: 4067220884

--------------------------------------------------------------------------------------------------
| Id  | Operation           | Name                       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |                            |     3 |    21 |     4  (25)| 00:00:01 |
|   1 |  RESULT CACHE       | 69cmubna179r6gh0sd1y59kbqz |       |       |            |          |
|   2 |   HASH GROUP BY     |                            |     3 |    21 |     4  (25)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| EMP                        |    14 |    98 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------

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

   1 - column-count=2; dependencies=(SCOTT.EMP); name="select /*+ result_cache */ deptno, avg(sal) from emp
 group by deptno"

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

可见在使用result_cache第二次查询根本没有访问buffer_cahce,执行性能非常高

适用场景:

查询记录很多,但返回的记录较少,并且重复查询的次数比较高,表的数据相对静态,变化不到

开启result_cache参数

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 2624K
result_cache_mode                    string      MANUAL
result_cache_remote_expiration       integer     0

result_cache_mode  Define using or not using result_cache

MANUAL  当sql语句有相关hint result_cache的时候使用此技术

FORCE 只要有可能,所有的语句都将使用result_cache

无论result_cache_mode如何测试,oracle将优先考虑sql语句中hint关于result_cache or no_result_cache的提示

默认情况下oracle result_cache_mode 为manual,一般不要把其设置为force,如果为force所有的查询将考虑result_cache 会增加不必要的开销。

时间: 2024-10-15 17:47:40

oracle result_cache的相关文章

在Oracle 11.2的数据库中建表时遇到 RESULT_CACHE (MODE DEFAULT) ORA-00922: missing or invalid option

在Oracle 11.2的数据库中建表时遇到 RESULT_CACHE (MODE DEFAULT)  ORA-00922: missing or invalid option hostdr:[/home/oracle]$sqlplus / as sysdba SQL*Plus: Release 11.2.0.3.0 Production on Thu Jul 9 12:52:11 2015 Copyright (c) 1982, 2011, Oracle. All rights reserve

Oracle DETERMINISTIC函数、PARALLEL_ENABLE函数、PIPELINED函数、RESULT_CACHE函数

1.DETERMINISTIC函数 -- Create deterministic PV function. CREATE OR REPLACE FUNCTION pv ( future_value NUMBER , periods NUMBER , interest NUMBER ) RETURN NUMBER DETERMINISTIC IS BEGIN RETURN future_value / ((1 + interest/100)**periods); END pv; 2.PARALL

oracle 11.2 result_cache说明

1 相关参数RESULT_CACHE_MAX_RESULT:指定任一结果可使用的最大高速缓存量,默认值为5%,但可指定1 到100 之间的任一百分比值,可在系统和会话级别上实施此参数:result_cache_max_size :32k的整数倍,如果将结果高速缓存的值设为0,则会禁用此结果高速缓存,不能超过共享池的75%; RESULT_CACHE_REMOTE_EXPIRATION:可以指定依赖于远程数据库对象的结果保持有效的时间(以分钟为单位),默认值为0,表示不会使用高速缓存使用远程对象的

Oracle 11g 的PL/SQL函数结果缓存

模仿Oracle性能诊断艺术中的例子做了两个试验,书上说如果不用RELIES_ON,则函数依赖的对象发生的变更操作就不会导致结果缓存的失效操作(result_cache RELIES_ON(test1,test2)),试验证明不对,函数f1()并没有使用RELIES_ON,但表上的变化影响到了函数. C:\Documents and Settings\guogang>sqlplus gg_test/[email protected]_gg SQL*Plus: Release 10.2.0.1.0

Oracle数据库之开发PL/SQL子程序和包

Oracle数据库之开发PL/SQL子程序和包 PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保存到数据库中,以便共享. 过程和函数均存储在数据库中,并通过参数与其调用者交换信息.过程和函数的唯一区别是函数总向调用者返回数据,而过程不返回数据. 1. 存储过程概念 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中.经过第一次编译后

oracle表名、字段名等对象的命名长度限制

原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/45854385 今天在为某系统数据库结构整理升级脚本时,遇到了"命名字节过长的错误",类似于下面的截图语句: 由于升级的结构中对于字段名的命名根据业务进行了修改,出现了命名过长的情况. 这里想说一下,对于oracle,表名.字段名等对象命名字节个数限制在

案例:Oracle dul数据挖掘 没有备份情况下非常规恢复drop删除的数据表

通过Oracle dul工具在没有备份情况下进行非常规恢复,找出drop删除的Oracle数据表中的数据进行恢复 dul对被drop对象进行恢复,需要提供两个信息1.被删除表所属表空间(非必须)2.被删除表结构(必须) 1.Oracle数据库中模拟删除表 --创建测试表 SQL> create table t_dul_drop tablespace czum 2 as 3 select * from dba_tables; Table created. --备份被删除表数据,便于比较和提供测试表

oracle SQL优化之高效的函数调用

原文地址:https://oracle-base.com/articles/misc/efficient-function-calls-from-sql http://www.oracle.com/technetwork/issue-archive/2011/11-sep/o51asktom-453438.html 1. 问题描述 我们说一个function是确定性的(deterministic),当对于相同的输入总是返回相同的输出,oracle中的内置函数如abs,不管多少次调用,abs(-1

Oracle 12c中增强的PL/SQL功能

英文链接:http://www.oracle.com/technetwork/issue-archive/2013/13-sep/o53plsql-1999801.html Oracle 12c增强了一系列定义和执行PL/SQL程序单元的方式.本文覆盖了Oracle 12c几个新特性: 1.为结果缓存条件优化了调用者权限函数 2.可以在SQL语句中定义和执行PL/SQL函数 3.通过ACCESSIBLE BY条件指定一个白名单来限制程序单元的访问 4.可直接授权角色给指定程序单元 调用者权限和P