Oracle11新特性——PLSQL函式快取結果(二)
打算寫一系列的文章介紹11g的新特性和變化。
這篇介紹11g新增功能PLSQL函式快取結果和DETERMINISTIC函式的區別。
Oracle11新特性——PLSQL函式快取結果(一):http://yangtingkun.itpub.net/post/468/393972
上一篇介紹了11g的PLSQL函式快取結果。這裡簡單說明一下RESULT_CACHE和DETERMINISTIC函式的區別。
如果瞭解DETERMINISTIC功能,會發現DETERMINISTIC函式和RESULT_CACHE有功能類似之處。兩種方法在函式輸入相同的時候,都可以避免函式的再次執行。不過二者的實現方式不同,所以表現出來的很多特點也不相同。
DETERMINISTIC函式的主要意義是告訴Oracle,當這個函式輸入的引數確定時,輸出也是確定的。而Oracle利用了這個功能,因此在一次函式呼叫中出現多次重複呼叫時,對函式只呼叫一次。
而11g新增的RESULT_CACHE則不然,這個方法是透過將函式呼叫的結果儲存在SGA的RESULT 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函式與SQLPLUS的ARRAYSIZE的關係的詳細描述可以參考:
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之間共享結果了。而使用了SGA的RESULT_CACHE則就是為了多個SESSION共享而設計的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-69421/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle11新特性——PLSQL函式快取結果(一)OracleSQL函式快取
- Oracle11新特性——PLSQL函式快取結果(三)OracleSQL函式快取
- Oracle11g新特性-PLSQL函式快取結果(一)[zt]OracleSQL函式快取
- Oracle11新特性——SQL快取結果集(五)OracleSQL快取
- Oracle11新特性——SQL快取結果集(三)OracleSQL快取
- Oracle11新特性——PLSQL新特性(二)OracleSQL
- PLSQL Language Reference-PL/SQL子程式-PL/SQL函式結果快取-開啟函式結果快取SQL函式快取
- PLSQL Language Reference-PL/SQL子程式-PL/SQL函式結果快取(二)SQL函式快取
- Oracle11新特性——PLSQL新特性(七)OracleSQL
- Oracle11新特性——PLSQL新特性(六)OracleSQL
- Oracle11新特性——PLSQL新特性(五)OracleSQL
- Oracle11新特性——PLSQL新特性(四)OracleSQL
- Oracle11新特性——PLSQL新特性(三)OracleSQL
- Oracle11新特性——PLSQL新特性(一)OracleSQL
- 11g新特性之結果集快取快取
- Oracle11新特性——虛擬列(二)Oracle
- 【11gR2新特性】DBMS_RESULT_CACHE管理結果快取的包快取
- Oracle11新特性——撤銷事務(二)Oracle
- Oracle11新特性——行列轉換語句(二)Oracle
- Oracle11新特性——分割槽功能增強(二)Oracle
- Oracle11新特性——備份恢復功能增強(二)Oracle
- Oracle11新特性——線上操作功能增強(二)Oracle
- Oracle11新特性——虛擬列Oracle
- 精讀《函式快取》函式快取
- DUMP函式結果的意思函式
- Oracle11gr2分析函式新特性(二)Oracle函式
- oracle result cache 結果集快取的使用Oracle快取
- 小議分析函式中排序對結果的影響(二)函式排序
- Oracle11新特性——撤銷事務(一)Oracle
- Oracle11新特性——分割槽功能增強Oracle
- Oracle11新特性——撤銷事務(三)Oracle
- 【Java8新特性】還沒搞懂函式式介面?趕快過來看看吧!Java函式
- Java8的新特性--函式式介面Java函式
- java8 新特性之函式式介面Java函式
- Spring 5 新特性:函式式Web框架Spring函式Web框架
- JDK8新特性之函式式介面JDK函式
- 快取函式的簡單使用快取函式
- DDL,DML操作對結果快取的影響快取