函式DETERMINISTIC
確定性函式
Oracle引入確定性函式的主要原因是為了提高以及函式的索引的效能,並最小化代價。因此,如果希望使用pl/sql函式使用給予函式的索引的基礎,那麼需要確保這個函式是確定性函式。
確定性函式的效能好處是如果使用相同的輸入呼叫函式兩次,Oracle可以記住第一個呼叫的結果因此避免在第二次執行時再次呼叫。但是該功能直到10g Release 2才被真正實施[@more@]經典例子如下:
CREATE TABLE test02(a NUMBER,b VARCHAR2(100));
INSERT INTO test02 VALUES(1,'aa');
INSERT INTO test02 VALUES(2,'bb');
INSERT INTO test02 VALUES(2,'cc');
INSERT INTO test02 VALUES(3,'dd');
CREATE SEQUENCE seq_test02;
CREATE OR REPLACE FUNCTION uf_getseq(p_number NUMBER) RETURN NUMBER DETERMINISTIC IS
v_seq NUMBER;
BEGIN
select seq_test02.nextval INTO v_seq from dual;
RETURN v_seq;
END;
/
SQL> select t.*,uf_getseq(t.a) from test02 t;
A B UF_GETSEQ(T.A)
---------- ---------- --------------
1 aa 17
2 bb 18
2 cc 18
3 dd 19
SQL>
經過上面可看到,函式引數相同時,就不再呼叫序列了。
再看一下另一個用處,基於自定義函式的索引:
SQL> CREATE OR REPLACE FUNCTION uf_getseq(p_number NUMBER) RETURN NUMBER IS
2 v_seq NUMBER;
3 BEGIN
4 select seq_test02.nextval INTO v_seq from dual;
5 RETURN v_seq;
6 END;
7 /
Function created
SQL> CREATE INDEX ix_a_test02 ON test02(uf_getseq(a));
CREATE INDEX ix_a_test02 ON test02(uf_getseq(a))
ORA-30553: 函式不能確定
SQL>
SQL> CREATE OR REPLACE FUNCTION uf_getseq(p_number NUMBER) RETURN NUMBER DETERMINISTIC IS
2 v_seq NUMBER;
3 BEGIN
4 select seq_test02.nextval INTO v_seq from dual;
5 RETURN v_seq;
6 END;
7 /
Function created
SQL> CREATE INDEX ix_a_test02 ON test02(uf_getseq(a));
Index created
SQL>
函式使用DETERMINISTIC後,就可建立基於自定義函式的索引了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10455206/viewspace-1037205/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- deterministic function 函式索引Function函式索引
- 建立函式索引須知DETERMINISTIC函式索引
- ORACLE FUNCTION函式中DETERMINISTIC測試OracleFunction函式
- 使用自定義函式創Function-Based Indexes時需要使用DETERMINISTIC Functions!函式FunctionIndex
- Oracle Deterministic FunctionOracleFunction
- DETERMINISTIC Functions (203)Function
- Deterministic Policy Gradient AlgorithmsGo
- oracle deterministic關鍵字.Oracle
- MySQL函式大全(字串函式,數學函式,日期函式,系統級函式,聚合函式)MySql函式字串
- Oracle 函式大全(字串函式,數學函式,日期函式,邏輯運算函式,其他函式)Oracle函式字串
- 【函式式 Swift】函式式思想函式Swift
- python中id()函式、zip()函式、map()函式、lamda函式Python函式
- 【函式】Oracle函式系列(2)--數學函式及日期函式函式Oracle
- Python 擴充之特殊函式(lambda 函式,map 函式,filter 函式,reduce 函式)Python函式Filter
- 第7章 IF函式 COUNTIF函式 SUMIF函式函式
- 字元函式、數字函式和日期函式字元函式
- 【函式】Oracle EXTRACT()函式與to_char() 函式函式Oracle
- MySQL(四)日期函式 NULL函式 字串函式MySql函式Null字串
- 【函式】ORACLE函式大全函式Oracle
- (譯) 函式式 JS #2: 函式!函式JS
- 核函式 多項式核函式 高斯核函式(常用)函式
- 函式名/函式地址/函式指標函式指標
- 第 8 節:函式-匿名函式、遞迴函式函式遞迴
- lambda匿名函式sorted排序函式filter過濾函式map對映函式函式排序Filter
- js函式 函式自呼叫 返回函式的函式 (閉包)JS函式
- main函式的入口函式AI函式
- (函式)實現strstr函式函式
- 字串函式之Strtok()函式字串函式
- SQL函式之日期函式SQL函式
- Oracle聚合函式/分析函式Oracle函式
- fork函式與vfork函式函式
- 常用函式--時間函式函式
- ORACLE單行函式與多行函式之七:多行函式之分組函式示例Oracle函式
- 函式式JavaScript(4):函式柯里化函式JavaScript
- 箭頭函式、簡寫函式、普通函式的區別函式
- Oracle OCP(03):字元函式、數字函式和日期函式Oracle字元函式
- webgl內建函式--幾何函式與矩陣函式Web函式矩陣
- webgl內建函式--向量函式與紋理查詢函式Web函式