我是靠谱客的博主 无辜飞鸟,最近开发中收集的这篇文章主要介绍oracle 11g函数包缓存,Oracle11新特性——PLSQL函数缓存结果(一),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Oracle11g新增的SQL缓存结果集的功能前面已经介绍过了。同时Oracle对PL/SQL的函数也进行了相应的增加。允许函数缓存返回结果。

先看一个简单的例子:

SQL> CREATE TABLE T AS SELECT * FROM DBA_SOURCE;

表已创建。

SQL> CREATE OR REPLACE FUNCTION F_NO_RESULT_CACHE RETURN NUMBER AS

2 V_RETURN NUMBER;

3 BEGIN

4 SELECT COUNT(*) INTO V_RETURN FROM T;

5 RETURN V_RETURN;

6 END;

7 /

函数已创建。

SQL> SET TIMING ON

SQL> SELECT F_NO_RESULT_CACHE FROM DUAL;

F_NO_RESULT_CACHE

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

593334

已用时间: 00: 00: 12.26

SQL> SELECT F_NO_RESULT_CACHE FROM DUAL;

F_NO_RESULT_CACHE

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

593334

已用时间: 00: 00: 07.53

SQL> SELECT F_NO_RESULT_CACHE FROM DUAL;

F_NO_RESULT_CACHE

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

593334

已用时间: 00: 00: 08.17

对于普通的函数,需要每次都重新执行,而如果采用了RESULT_CACHE功能?br />

SQL> CREATE OR REPLACE FUNCTION F_RESULT_CACHE RETURN NUMBER RESULT_CACHE AS

2 V_RETURN NUMBER;

3 BEGIN

4 SELECT COUNT(*) INTO V_RETURN FROM T;

5 RETURN V_RETURN;

6 END;

7 /

函数已创建。

已用时间: 00: 00: 00.03

SQL> SELECT F_RESULT_CACHE FROM DUAL;

F_RESULT_CACHE

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

593334

已用时间: 00: 00: 07.87

SQL> SELECT F_RESULT_CACHE FROM DUAL;

F_RESULT_CACHE

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

593334

已用时间: 00: 00: 00.06

SQL> DISC从 Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production

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

SQL> CONN YANGTK/yangtk@ORA11G已连接。

SQL> SELECT F_RESULT_CACHE FROM DUAL;

F_RESULT_CACHE

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

593334

已用时间: 00: 00: 00.04

对于采用了RESULT_CACHE的函数,Oracle自动将函数的返回结果缓存,下次执行的时候,不会实际执行函数,而是直接返回结果。

而且由于缓存的结果存储在SGA中,因此所有的会话可以共享这个结果。在上面的例子中,断开连接并重建登陆后,新的会话也是可以利用存储在SGA中的函数缓存的。

注意,函数的RESULT_CACHE功能自动和函数的输入参数关联,即使输入参数不起任何作用,不同的输入参数也会导致RESULT_CACHE不生效。

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

2 V_RETURN NUMBER;

3 BEGIN

4 SELECT COUNT(*) INTO V_RETURN FROM T;

5 RETURN V_RETURN;

6 END;

7 /

函数已创建。

已用时间: 00: 00: 00.07

SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;

F_RESULT_CACHE(1)

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

593334

已用时间: 00: 00: 06.90

SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;

F_RESULT_CACHE(1)

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

593334

已用时间: 00: 00: 00.04

SQL> SELECT F_RESULT_CACHE(2) FROM DUAL;

F_RESULT_CACHE(2)

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

593334

已用时间: 00: 00: 07.15

下面看一下RELIES_ON语句对RESULT_CACHE的影响。建立了上面的函数只完成了一部分功能,如果函数中访问了数据库中的对象,那么需要指定RELIES_ON语句来说明结果依赖的对象。如果没有制定,会导致函数访问的数据变化后,RESULT CACHE仍然生效,这时候会返回错误的结果:

SQL> SELECT COUNT(*) FROM T;

COUNT(*)

----------

593334

已用时间: 00: 00: 08.11

SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;

F_RESULT_CACHE(1)

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

593334

已用时间: 00: 00: 00.34

SQL> DELETE T WHERE ROWNUM = 1;

已删除 1 行。

已用时间: 00: 00: 00.04

SQL> SELECT COUNT(*) FROM T;

COUNT(*)

----------

593333

已用时间: 00: 00: 08.23

SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;

F_RESULT_CACHE(1)

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

593334

已用时间: 00: 00: 00.06

SQL> COMMIT;

提交完成。

已用时间: 00: 00: 00.03

SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;

F_RESULT_CACHE(1)

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

593334

已用时间: 00: 00: 00.06

由于没有指定依赖关系,Oracle并不会自动维护RESULT CACHE的正确性,这种依赖关系需要在建立函数的时候通过RELIES_ON来建立:

SQL> EXEC DBMS_RESULT_CACHE.FLUSH

PL/SQL 过程已成功完成。

已用时间: 00: 00: 00.03

SQL> CREATE OR REPLACE FUNCTION F_RESULT_CACHE(P_IN NUMBER)

2 RETURN NUMBER RESULT_CACHE RELIES_ON (T) AS

3 V_RETURN NUMBER;

4 BEGIN

5 SELECT COUNT(*) INTO V_RETURN FROM T;

6 RETURN V_RETURN;

7 END;

8 /

函数已创建。

已用时间: 00: 00: 00.04

SQL> SELECT COUNT(*) FROM T;

COUNT(*)

----------

593333

已用时间: 00: 00: 09.60

SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;

F_RESULT_CACHE(1)

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

593333

已用时间: 00: 00: 04.82

SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;

F_RESULT_CACHE(1)

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

593333

已用时间: 00: 00: 00.06

SQL> DELETE T WHERE ROWNUM = 1;

已删除 1 行。

已用时间: 00: 00: 00.03

SQL> SELECT COUNT(*) FROM T;

COUNT(*)

----------

593332

已用时间: 00: 00: 00.26

SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;

F_RESULT_CACHE(1)

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

593332

已用时间: 00: 00: 00.29

添加了RELIES_ON语句后,Oracle会根据依赖对象自动INVALIDATE结果集,从而保证RESULT CACHE的正确性。

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

最后

以上就是无辜飞鸟为你收集整理的oracle 11g函数包缓存,Oracle11新特性——PLSQL函数缓存结果(一)的全部内容,希望文章能够帮你解决oracle 11g函数包缓存,Oracle11新特性——PLSQL函数缓存结果(一)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部