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) |

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值