Chinaunix首页 | 论坛 | 博客
  • 博客访问: 11590596
  • 博文数量: 8065
  • 博客积分: 10002
  • 博客等级: 中将
  • 技术积分: 96708
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-16 17:06
文章分类

全部博文(8065)

文章存档

2008年(8065)

分类: 服务器与存储

2008-07-16 10:27:42

上一篇介绍了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共享而设计的。
阅读(784) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~