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函数缓存结果(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python模块管理工具,Python的
- 下一篇: centOS7:创建的新用户如何获得写权