oracle 11g函数包缓存,Oracle 11g 的PL/SQL函数结果缓存

模仿Oracle性能诊断艺术中的例子做了两个试验,书上说如果不用RELIES_ON,则函数依赖的对象发生的变更操作就不会导致结果缓存的失效操作(result_cache RELIES_ON(test1,test2)),试验证明不对,函数f1()并没有使用RELIES_ON,但表上的变化影响到了函数。

C:\Documents and Settings\guogang>sqlplus gg_test/gg_test@10.10.15.25_gg

SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 8月 4 19:46:44 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

连接到:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

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

SQL> select * from v$version;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

PL/SQL Release 11.2.0.1.0 - Production

CORE    11.2.0.1.0      Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production

SQL> drop table test1 purge;

SQL> drop table test2 purge;

SQL> create table test1 as select * from dba_objects;

SQL> create table test2 as select * from all_objects;

SQL> select count(*) from test1;

COUNT(*)

----------

74144

SQL> select count(*) from test2;

COUNT(*)

----------

73248

SQL> create or replace function f1

return number

is

l_ret number;

begin

select count(*) into l_ret

from test1,test2

where test1.object_type = test2.object_type

and test1.object_type in ('TABLE SUBPARTITION','VIEW','INDEX','TABLE');

return l_ret;

end;

/

函数已创建。

SQL> set timing on

SQL> select f1() from dual;

F1()

----------

60681409

已用时间:  00: 00: 07.29

--禁用结果缓存

SQL> execute dbms_result_cache.Bypass(bypass_mode=>true,session=>true);

SQL> select f1() from dual;

F1()

----------

60681409

已用时间:  00: 00: 03.60

--启用结果缓存

SQL> execute dbms_result_cache.Bypass(bypass_mode=>false,session=>true);

SQL> select f1() from dual;

F1()

----------

60681409

已用时间:  00: 00: 00.00

SQL> delete from test1 where object_type = 'VIEW' and rownum <100;

SQL> delete from test2 where object_type = 'VIEW' and rownum <100;

SQL> commit;

SQL> select f1() from dual;

F1()

----------

59788330

已用时间:  00: 00: 07.09  --可以看到数据发生变化,即使不使用RELIES_ON,结果集也是正确的。

SQL> select count(*)

from test1, test2

where test1.object_type = test2.object_type

and test1.object_type in ('TABLE SUBPARTITION','VIEW','INDEX','TABLE');

COUNT(*)

----------

59788330已用时间:  00: 00: 03.56

SQL> create or replace function f2

return number

result_cache RELIES_ON(test1,test2)

is

l_ret number;

begin

select count(*) into l_ret

from test1,test2

where test1.object_type = test2.object_type

and test1.object_type in ('TABLE SUBPARTITION','VIEW','INDEX','TABLE');

return l_ret;

end;

/

函数已创建。

SQL> select f2() from dual;

F2()

----------

59788330

已用时间:  00: 00: 03.54

SQL> select f2() from dual;

F2()

----------

59788330

已用时间:  00: 00: 00.00

SQL> delete from test1 where object_type = 'VIEW' and rownum <100;

SQL> delete from test2 where object_type = 'VIEW' and rownum <100;

SQL> commit;

SQL> select f2() from dual;

F2()

----------

58914853

已用时间:  00: 00: 03.50

SQL> select count(*)

from test1, test2

where test1.object_type = test2.object_type

and test1.object_type in ('TABLE SUBPARTITION','VIEW','INDEX','TABLE');

COUNT(*)

----------

58914853

已用时间:  00: 00: 03.50

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值