程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle11g的PL/SQL函數結果緩存

Oracle11g的PL/SQL函數結果緩存

編輯:Oracle教程

Oracle11g的PL/SQL函數結果緩存


模仿Oracle性能診斷藝術中的例子做了兩個試驗,書上說如果不用RELIES_ON,則函數依賴的對象發生的變更操作就不會導致結果緩存的失效操作(result_cache RELIES_ON(test1,test2)),試驗證明不對,函數f1()並沒有使用RELIES_ON,但表上的變化影響到了函數。

C:\Documents and Settings\guogang>sqlplus gg_test/[email protected]_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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved