ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle11新特性——PLSQL函数缓存结果(二)

Oracle11新特性——PLSQL函数缓存结果(二)

原创 Linux操作系统 作者:yangtingkun 时间:2007-09-11 00:00:00 0 删除 编辑

打算写一系列的文章介绍11g的新特性和变化。

这篇介绍11g新增功能PLSQL函数缓存结果和DETERMINISTIC函数的区别。

Oracle11新特性——PLSQL函数缓存结果(一):http://yangtingkun.itpub.net/post/468/393972


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

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

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

而11g新增的RESULT_CACHE则不然,这个方法是通过将函数调用的结果保存在SGARESULT 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函数与SQLPLUSARRAYSIZE的关系的详细描述可以参考:

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之间共享结果了。而使用了SGARESULT_CACHE则就是为了多个SESSION共享而设计的。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-69421/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10354282