Oracle11新特性——PLSQL函式快取結果(二)

yangtingkun發表於2007-09-11

打算寫一系列的文章介紹11g的新特性和變化。

這篇介紹11g新增功能PLSQL函式快取結果和DETERMINISTIC函式的區別。

Oracle11新特性——PLSQL函式快取結果(一):http://yangtingkun.itpub.net/post/468/393972


上一篇介紹了11g的PLSQL函式快取結果。這裡簡單說明一下RESULT_CACHEDETERMINISTIC函式的區別。

如果瞭解DETERMINISTIC功能,會發現DETERMINISTIC函式和RESULT_CACHE有功能類似之處。兩種方法在函式輸入相同的時候,都可以避免函式的再次執行。不過二者的實現方式不同,所以表現出來的很多特點也不相同。

DETERMINISTIC函式的主要意義是告訴Oracle,當這個函式輸入的引數確定時,輸出也是確定的。而Oracle利用了這個功能,因此在一次函式呼叫中出現多次重複呼叫時,對函式只呼叫一次。

而11g新增的RESULT_CACHE則不然,這個方法是透過將函式呼叫的結果儲存在SGARESULT CACHE中來實現的。當Oracle執行一個函式時,如果在RESULT CACHE中可以找到相關的結果,那麼Oracle就不會再次執行這個函式,而直接將結果返回。

瞭解了這兩個功能的實現方法,也就清楚了二者的區別。對於DETERMINISTIC功能而言,只有一次呼叫中的函式重複執行,才能避免函式的多次執行。而對於RESULT_CACHE而言,由於結果被SGA進行快取,隨後的呼叫都可以利用這個結果,而且其他的SESSION也是可以共享這個結果的。

用一個簡單的例子來說明這個問題:

SQL> CREATE OR REPLACE FUNCTION F_RESULT_CACHE (P_ID NUMBER) RETURN NUMBER RESULT_CACHE AS
2 BEGIN
3 DBMS_LOCK.SLEEP(5);
4 RETURN 1;
5 END;
6 /

Function created.

SQL>
SQL>
SQL> CREATE OR REPLACE FUNCTION F_RESULT_CACHE (P_ID NUMBER) RETURN NUMBER RESULT_CACHE AS
2 BEGIN
3 DBMS_LOCK.SLEEP(5);
4 RETURN 1;
5 END;
6 /

Function created.

SQL> CREATE OR REPLACE FUNCTION F_DETERMINISTIC (P_ID NUMBER) RETURN NUMBER DETERMINISTIC AS
2 BEGIN
3 DBMS_LOCK.SLEEP(5);
4 RETURN 1;
5 END;
6 /

Function created.

SQL> SET TIMING ON
SQL> SELECT F_DETERMINISTIC(1) FROM DUAL;

F_DETERMINISTIC(1)
------------------
1

Elapsed: 00:00:05.05
SQL> SELECT F_DETERMINISTIC(1) FROM DUAL;

F_DETERMINISTIC(1)
------------------
1

Elapsed: 00:00:05.01
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;

F_RESULT_CACHE(1)
-----------------
1

Elapsed: 00:00:05.14
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;

F_RESULT_CACHE(1)
-----------------
1

Elapsed: 00:00:00.00

從這裡就可以看到二者的區別。DETERMINISTIC函式只對一次呼叫中的重複生效:

SQL> SELECT F_DETERMINISTIC(3) FROM TAB;

F_DETERMINISTIC(3)
------------------
1
1
1
1
1
1

6 rows selected.

Elapsed: 00:00:10.04
SQL> SELECT F_RESULT_CACHE(3) FROM TAB;

F_RESULT_CACHE(3)
-----------------
1
1
1
1
1
1

6 rows selected.

Elapsed: 00:00:05.02

由於SQLPLUS批次陣列讀取的機制,導致DETERMINISTIC方法對函式呼叫了兩次。而RESULT_CACHE在一個查詢中馬上就可以使用前面語句得到的結果,所以函式只呼叫了一次。

DETERMINISTIC函式與SQLPLUSARRAYSIZE的關係的詳細描述可以參考:

SQL> host
[oracle@yangtk ~]$ sqlplus yangtk/yangtk

SQL*Plus: Release 11.1.0.6.0 - Production on Mon Sep 10 15:33:14 2007

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


Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> SET TIMING ON
SQL> SELECT F_DETERMINISTIC(1) FROM DUAL;

F_DETERMINISTIC(1)
------------------
1

Elapsed: 00:00:05.01
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;

F_RESULT_CACHE(1)
-----------------
1

Elapsed: 00:00:00.00

DETERMINISTIC函式對於多次呼叫都無能為力,更不用說不同SESSION之間共享結果了。而使用了SGARESULT_CACHE則就是為了多個SESSION共享而設計的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-69421/,如需轉載,請註明出處,否則將追究法律責任。

相關文章