oracle 11g函数包缓存,Oracle11新特性——PLSQL函数缓存结果(二)
上一篇介绍了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函数缓存结果(二)相关推荐
- oracle 11g函数包缓存,Oracle11新特性——PLSQL函数缓存结果(一)
Oracle11g新增的SQL缓存结果集的功能前面已经介绍过了.同时Oracle对PL/SQL的函数也进行了相应的增加.允许函数缓存返回结果. 先看一个简单的例子: SQL> CREATE TA ...
- php7.1函数,PHP7.1常用新特性和函数
在php7发布了之后,官方又紧接着发布了php7.1.php7.2,我们也接着使用了新版本.接下来就说说7.1有那些新的特性. Nullable types 在7的时候,如果使用了强类型就必须传递或者 ...
- Oracle11新特性——初始化文件管理
Oracle11新特性--初始化文件管理 11g对于初始化增加了一个很实用的功能,可以根据内存中的参数设置来创建初始化参数文件. Oracle从9i推出了SPFILE之后,就给出了使用PFILE ...
- 极速体验:Oracle 18c下载和Scalable Sequence新特性
Oracle 18c 如约已至,目前已经可以从 Oracle Edelivery 网站下载.该网站地址是:https://edelivery.oracle.com 搜索 Oracle Database ...
- ES6新特性(函数默认参数,箭头函数)
ES6新特性之 函数参数的默认值写法 和 箭头函数. 1.函数参数的默认值 ES5中不能直接为函数的参数指定默认值,只能通过以下的变通方式: 从上面的代码可以看出存在一个问题,当传入的参数为0或者 ...
- php7 断言,PHP7.2常用新特性和函数
通过这篇你将了解PHP 7.2版本中添加的一些新特性和函数. PHP 7.2是一个LTS版本,他提供了一些新功能和几个较小的核心改进.开箱即用的PHP 7.2为我们提供了新的哈希,类型提示,类型扩展和 ...
- 【Redis】 - Redis 6.0 新特性之客户端缓存
Redis 6.0 新特性之客户端缓存 1. 为什么需要客户端缓存 1.1 低延迟和大规模提供数据服务 1.2 其他 cache 层 2. Redis 中的客户端缓存 2.1 什么样的数据集应该被客户 ...
- 跟我学 Java 8 新特性之 Stream 流(二)关键知识点
转载自 跟我学 Java 8 新特性之 Stream 流(二)关键知识点 我们的第一篇文章,主要是通过一个Demo,让大家体验了一下使用流API的那种酣畅淋漓的感觉.如果你没有实践,我还是再次呼吁 ...
- oracle如何查询虚拟列,Oracle11g新特性之--虚拟列(VirtualColumn)
Oracle 11g新特性之--虚拟列(Virtual Column) Oracle 11G虚拟列Virtual Column介绍 在老的 Oracle 版本,当我们需要使用表达式或者一些计算公式时, ...
- oracle 11g使用deferred_segment_creation 延迟段创建特性时遇到的问题总结
总结,下面是两个问题.问题1是用户可以在所有表空间创建表;问题2是exp不能导出空表 问题1: 版本:oracle 11.2.0.1.0 select * from v$version; 创建用户aa ...
最新文章
- spark编程基础--5.3数据读写
- 如何获取字符串的最后一个字符?
- 使用c:foreach时链接失效
- mysql时间与字符串相互转换
- python初学者用什么开发环境_python初学者用什么开发环境
- 计算机中丢失xapofx1 5.dll,xapofx1 5 dll丢失怎么办_系统提示xapofx1 5 dll丢失的解决方法...
- php apache停止工作,phpStudy Apache 经常出现停止工作
- 信安精品课:第7章访问控制技术原理与应用精讲笔记
- 2018-12-28
- 开课吧课堂:C++开发语言的应用方向有哪些?
- 100篇文献-万字总结 || 强化学习求解车间调度
- 【语音判别】基于matlab双门限法判别语音信号【含Matlab源码 1720期】
- C#使用ITextSharp操作pdf
- LPC1788入门手记
- C语言加法测试题,c语言50练习题.doc
- 级联阴影贴图(CSM)
- 【第1128期】从北京回来的年轻人,该告诉你点什么?
- 【播放器】媒体播放器三大架构
- linux 挂载裸设备,centos挂载裸设备问题
- 微软官方出了一款吊打WPS的PPT插件