上一篇介绍了11g的PLSQL函数缓存结果。这里简单说明一下RESULT_CACHE和DETERMINISTIC函数的区别。

如果了解DETERMINISTIC功能,会发现DETERMINISTIC函数和RESULT_CACHE有功能类似之处。两种方法在函数输入相同的时候,都可以避免函数的再次执行。不过二者的实现方式不同,所以表现出来的很多特点也不相同。

DETERMINISTIC函数的主要意义是告诉Oracle,当这个函数输入的参数确定时,输出也是确定的。而Oracle利用了这个功能,因此在一次函数调用中出现多次重复调用时,对函数只调用一次。

而11g新增的RESULT_CACHE则不然,这个方法是通过将函数调用的结果保存在SGA的RESULT CACHE中来实现的。当Oracle执行一个函数时,如果在RESULT CACHE中可以找到相关的结果,那么Oracle就不会再次执行这个函数,而直接将结果返回。

了解了这两个功能的实现方法,也就清楚了二者的区别。对于DETERMINISTIC功能而言,只有一次调用中的函数重复执行,才能避免函数的多次执行。而对于RESULT_CACHE而言,由于结果被SGA进行缓存,随后的调用都可以利用这个结果,而且其他的SESSION也是可以共享这个结果的。

用一个简单的例子来说明这个问题:

SQL> CREATE OR REPLACE FUNCTION F_RESULT_CACHE (P_ID NUMBER) RETURN NUMBER RESULT_CACHE AS

2 BEGIN

3 DBMS_LOCK.SLEEP(5);

4 RETURN 1;

5 END;

6 /

Function created.

SQL>

SQL>

SQL> CREATE OR REPLACE FUNCTION F_RESULT_CACHE (P_ID NUMBER) RETURN NUMBER RESULT_CACHE AS

2 BEGIN

3 DBMS_LOCK.SLEEP(5);

4 RETURN 1;

5 END;

6 /

Function created.

SQL> CREATE OR REPLACE FUNCTION F_DETERMINISTIC (P_ID NUMBER) RETURN NUMBER DETERMINISTIC AS

2 BEGIN

3 DBMS_LOCK.SLEEP(5);

4 RETURN 1;

5 END;

6 /

Function created.

SQL> SET TIMING ON

SQL> SELECT F_DETERMINISTIC(1) FROM DUAL;

F_DETERMINISTIC(1)

------------------

1

Elapsed: 00:00:05.05

SQL> SELECT F_DETERMINISTIC(1) FROM DUAL;

F_DETERMINISTIC(1)

------------------

1

Elapsed: 00:00:05.01

SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;

F_RESULT_CACHE(1)

-----------------

1

Elapsed: 00:00:05.14

SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;

F_RESULT_CACHE(1)

-----------------

1

Elapsed: 00:00:00.00

从这里就可以看到二者的区别。DETERMINISTIC函数只对一次调用中的重复生效:

SQL> SELECT F_DETERMINISTIC(3) FROM TAB;

F_DETERMINISTIC(3)

------------------

1

1

1

1

1

1

6 rows selected.

Elapsed: 00:00:10.04

SQL> SELECT F_RESULT_CACHE(3) FROM TAB;

F_RESULT_CACHE(3)

-----------------

1

1

1

1

1

1

6 rows selected.

Elapsed: 00:00:05.02

由于SQLPLUS批量数组读取的机制,导致DETERMINISTIC方法对函数调用了两次。而RESULT_CACHE在一个查询中马上就可以使用前面语句得到的结果,所以函数只调用了一次。

DETERMINISTIC函数与SQLPLUS的ARRAYSIZE的关系的详细描述可以参考:

SQL> host

[oracle@yangtk ~]$ sqlplus yangtk/yangtk

SQL*Plus: Release 11.1.0.6.0 - Production on Mon Sep 10 15:33:14 2007

Copyright (c) 1982, 2007, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> SET TIMING ON

SQL> SELECT F_DETERMINISTIC(1) FROM DUAL;

F_DETERMINISTIC(1)

------------------

1

Elapsed: 00:00:05.01

SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;

F_RESULT_CACHE(1)

-----------------

1

Elapsed: 00:00:00.00

DETERMINISTIC函数对于多次调用都无能为力,更不用说不同SESSION之间共享结果了。而使用了SGA的RESULT_CACHE则就是为了多个SESSION共享而设计的。

阅读(409) | 评论(0) | 转发(0) |

oracle 11g函数包缓存,Oracle11新特性——PLSQL函数缓存结果(二)相关推荐

  1. oracle 11g函数包缓存,Oracle11新特性——PLSQL函数缓存结果(一)

    Oracle11g新增的SQL缓存结果集的功能前面已经介绍过了.同时Oracle对PL/SQL的函数也进行了相应的增加.允许函数缓存返回结果. 先看一个简单的例子: SQL> CREATE TA ...

  2. php7.1函数,PHP7.1常用新特性和函数

    在php7发布了之后,官方又紧接着发布了php7.1.php7.2,我们也接着使用了新版本.接下来就说说7.1有那些新的特性. Nullable types 在7的时候,如果使用了强类型就必须传递或者 ...

  3. Oracle11新特性——初始化文件管理

    Oracle11新特性--初始化文件管理   11g对于初始化增加了一个很实用的功能,可以根据内存中的参数设置来创建初始化参数文件.  Oracle从9i推出了SPFILE之后,就给出了使用PFILE ...

  4. 极速体验:Oracle 18c下载和Scalable Sequence新特性

    Oracle 18c 如约已至,目前已经可以从 Oracle Edelivery 网站下载.该网站地址是:https://edelivery.oracle.com 搜索 Oracle Database ...

  5. ES6新特性(函数默认参数,箭头函数)

    ES6新特性之 函数参数的默认值写法 和 箭头函数. 1.函数参数的默认值 ES5中不能直接为函数的参数指定默认值,只能通过以下的变通方式:   从上面的代码可以看出存在一个问题,当传入的参数为0或者 ...

  6. php7 断言,PHP7.2常用新特性和函数

    通过这篇你将了解PHP 7.2版本中添加的一些新特性和函数. PHP 7.2是一个LTS版本,他提供了一些新功能和几个较小的核心改进.开箱即用的PHP 7.2为我们提供了新的哈希,类型提示,类型扩展和 ...

  7. 【Redis】 - Redis 6.0 新特性之客户端缓存

    Redis 6.0 新特性之客户端缓存 1. 为什么需要客户端缓存 1.1 低延迟和大规模提供数据服务 1.2 其他 cache 层 2. Redis 中的客户端缓存 2.1 什么样的数据集应该被客户 ...

  8. 跟我学 Java 8 新特性之 Stream 流(二)关键知识点

    转载自   跟我学 Java 8 新特性之 Stream 流(二)关键知识点 我们的第一篇文章,主要是通过一个Demo,让大家体验了一下使用流API的那种酣畅淋漓的感觉.如果你没有实践,我还是再次呼吁 ...

  9. oracle如何查询虚拟列,Oracle11g新特性之--虚拟列(VirtualColumn)

    Oracle 11g新特性之--虚拟列(Virtual Column) Oracle 11G虚拟列Virtual Column介绍 在老的 Oracle 版本,当我们需要使用表达式或者一些计算公式时, ...

  10. oracle 11g使用deferred_segment_creation 延迟段创建特性时遇到的问题总结

    总结,下面是两个问题.问题1是用户可以在所有表空间创建表;问题2是exp不能导出空表 问题1: 版本:oracle 11.2.0.1.0 select * from v$version; 创建用户aa ...

最新文章

  1. spark编程基础--5.3数据读写
  2. 如何获取字符串的最后一个字符?
  3. 使用c:foreach时链接失效
  4. mysql时间与字符串相互转换
  5. python初学者用什么开发环境_python初学者用什么开发环境
  6. 计算机中丢失xapofx1 5.dll,xapofx1 5 dll丢失怎么办_系统提示xapofx1 5 dll丢失的解决方法...
  7. php apache停止工作,phpStudy Apache 经常出现停止工作
  8. 信安精品课:第7章访问控制技术原理与应用精讲笔记
  9. 2018-12-28
  10. 开课吧课堂:C++开发语言的应用方向有哪些?
  11. 100篇文献-万字总结 || 强化学习求解车间调度
  12. 【语音判别】基于matlab双门限法判别语音信号【含Matlab源码 1720期】
  13. C#使用ITextSharp操作pdf
  14. LPC1788入门手记
  15. C语言加法测试题,c语言50练习题.doc
  16. 级联阴影贴图(CSM)
  17. 【第1128期】从北京回来的年轻人,该告诉你点什么?
  18. 【播放器】媒体播放器三大架构
  19. linux 挂载裸设备,centos挂载裸设备问题
  20. 微软官方出了一款吊打WPS的PPT插件

热门文章

  1. springMVC Model ModelMap 和 ModelAndView的区别
  2. nginx下apk下载,ie9的问题
  3. 现实世界的Windows Azure:采访Transparencia Sp. z o.o的Grzegorz Skowron-Moszkowicz
  4. 如何购买微软的wince 等授权组件等?(找到了!)
  5. 新建SVN Repository
  6. PHP实现文件上传,下载,批量下载
  7. PHP审核接口基本判断
  8. PHP数组键不存在给默认值
  9. [R语言绘图]直方图hist
  10. Matlab函数——dct2