oracle 11g函数包缓存,Oracle11新特性——PLSQL函数缓存结果(一)
Oracle11g新增的SQL緩存結(jié)果集的功能前面已經(jīng)介紹過了。同時(shí)Oracle對PL/SQL的函數(shù)也進(jìn)行了相應(yīng)的增加。允許函數(shù)緩存返回結(jié)果。
先看一個(gè)簡單的例子:
SQL> CREATE TABLE T AS SELECT * FROM DBA_SOURCE;
表已創(chuàng)建。
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 /
函數(shù)已創(chuàng)建。
SQL> SET TIMING ON
SQL> SELECT F_NO_RESULT_CACHE FROM DUAL;
F_NO_RESULT_CACHE
-----------------
593334
已用時(shí)間: 00: 00: 12.26
SQL> SELECT F_NO_RESULT_CACHE FROM DUAL;
F_NO_RESULT_CACHE
-----------------
593334
已用時(shí)間: 00: 00: 07.53
SQL> SELECT F_NO_RESULT_CACHE FROM DUAL;
F_NO_RESULT_CACHE
-----------------
593334
已用時(shí)間: 00: 00: 08.17
對于普通的函數(shù),需要每次都重新執(zhí)行,而如果采用了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 /
函數(shù)已創(chuàng)建。
已用時(shí)間: 00: 00: 00.03
SQL> SELECT F_RESULT_CACHE FROM DUAL;
F_RESULT_CACHE
--------------
593334
已用時(shí)間: 00: 00: 07.87
SQL> SELECT F_RESULT_CACHE FROM DUAL;
F_RESULT_CACHE
--------------
593334
已用時(shí)間: 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
已用時(shí)間: 00: 00: 00.04
對于采用了RESULT_CACHE的函數(shù),Oracle自動(dòng)將函數(shù)的返回結(jié)果緩存,下次執(zhí)行的時(shí)候,不會(huì)實(shí)際執(zhí)行函數(shù),而是直接返回結(jié)果。
而且由于緩存的結(jié)果存儲(chǔ)在SGA中,因此所有的會(huì)話可以共享這個(gè)結(jié)果。在上面的例子中,斷開連接并重建登陸后,新的會(huì)話也是可以利用存儲(chǔ)在SGA中的函數(shù)緩存的。
注意,函數(shù)的RESULT_CACHE功能自動(dòng)和函數(shù)的輸入?yún)?shù)關(guān)聯(lián),即使輸入?yún)?shù)不起任何作用,不同的輸入?yún)?shù)也會(huì)導(dǎo)致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 /
函數(shù)已創(chuàng)建。
已用時(shí)間: 00: 00: 00.07
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------
593334
已用時(shí)間: 00: 00: 06.90
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------
593334
已用時(shí)間: 00: 00: 00.04
SQL> SELECT F_RESULT_CACHE(2) FROM DUAL;
F_RESULT_CACHE(2)
-----------------
593334
已用時(shí)間: 00: 00: 07.15
下面看一下RELIES_ON語句對RESULT_CACHE的影響。建立了上面的函數(shù)只完成了一部分功能,如果函數(shù)中訪問了數(shù)據(jù)庫中的對象,那么需要指定RELIES_ON語句來說明結(jié)果依賴的對象。如果沒有制定,會(huì)導(dǎo)致函數(shù)訪問的數(shù)據(jù)變化后,RESULT CACHE仍然生效,這時(shí)候會(huì)返回錯(cuò)誤的結(jié)果:
SQL> SELECT COUNT(*) FROM T;
COUNT(*)
----------
593334
已用時(shí)間: 00: 00: 08.11
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------
593334
已用時(shí)間: 00: 00: 00.34
SQL> DELETE T WHERE ROWNUM = 1;
已刪除 1 行。
已用時(shí)間: 00: 00: 00.04
SQL> SELECT COUNT(*) FROM T;
COUNT(*)
----------
593333
已用時(shí)間: 00: 00: 08.23
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------
593334
已用時(shí)間: 00: 00: 00.06
SQL> COMMIT;
提交完成。
已用時(shí)間: 00: 00: 00.03
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------
593334
已用時(shí)間: 00: 00: 00.06
由于沒有指定依賴關(guān)系,Oracle并不會(huì)自動(dòng)維護(hù)RESULT CACHE的正確性,這種依賴關(guān)系需要在建立函數(shù)的時(shí)候通過RELIES_ON來建立:
SQL> EXEC DBMS_RESULT_CACHE.FLUSH
PL/SQL 過程已成功完成。
已用時(shí)間: 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 /
函數(shù)已創(chuàng)建。
已用時(shí)間: 00: 00: 00.04
SQL> SELECT COUNT(*) FROM T;
COUNT(*)
----------
593333
已用時(shí)間: 00: 00: 09.60
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------
593333
已用時(shí)間: 00: 00: 04.82
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------
593333
已用時(shí)間: 00: 00: 00.06
SQL> DELETE T WHERE ROWNUM = 1;
已刪除 1 行。
已用時(shí)間: 00: 00: 00.03
SQL> SELECT COUNT(*) FROM T;
COUNT(*)
----------
593332
已用時(shí)間: 00: 00: 00.26
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------
593332
已用時(shí)間: 00: 00: 00.29
添加了RELIES_ON語句后,Oracle會(huì)根據(jù)依賴對象自動(dòng)INVALIDATE結(jié)果集,從而保證RESULT CACHE的正確性。
閱讀(125) | 評(píng)論(0) | 轉(zhuǎn)發(fā)(0) |
總結(jié)
以上是生活随笔為你收集整理的oracle 11g函数包缓存,Oracle11新特性——PLSQL函数缓存结果(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python模块管理工具,Python的
- 下一篇: mysql 按时间累计计算_精通MySQ