關於oracle 函式的Deterministic

2021-08-19 14:40:18 字數 2145 閱讀 5491

在建立函式索引的時候,自定義的函式需要加deterministic

確定性函式的效能好處是如果使用相同的輸入呼叫函式兩次,oracle可以記住第乙個呼叫的結果因此避免在第二次執行時再次呼叫。

但是該功能直到10g release 2才被真正實施。

環境11g

測試1:

create or replace package deter_body is

v_glo_count pls_integer:=0;

end deter_body; --可以定義全域性變數,這裡先不用,還要歸零操作,麻煩

create

orreplace

function deter_fun(

numpls_integer

) return

pls_integer

as begin

dbms_output.put_line(

'訪問flag'

); return

num;

end deter_fun;

--觀察輸出結果

--這種呼叫,每一行都會訪問一次, 因為操作的是篩選後的行值

select deter_fun(5)

from emp e where e.deptno=20;

--發現deter_fun的呼叫次數為emp的記錄數,可怕,相當於,先全表調一次函式,再使用條件

select

*from emp e where e.deptno= deter_fun(

20);

--加deterministic

create

orreplace

function deter_fun(

numpls_integer

) return

pls_integer

deterministic

as begin

dbms_output.put_line(

'訪問flag'

); return

num;

end deter_fun;

--可以看到

--訪問一次

select deter_fun(5)

from emp e where e.deptno=20;

--訪問一次

select

*from emp e where e.deptno= deter_fun(

20);

--4次select  deter_fun(

level

)from dual connect

byrownum

<5;

例2:create

orreplace

function deter_fun2

return

pls_integer

as v_val number

; begin

v_val:=

trunc

(dbms_random.value(0,

999));

dbms_output.put_line(

'訪問flag'

); return v_val;

end deter_fun2;

--訪問14次

select

*from emp e where e.empno=deter_fun2(); --

我們加上deterministic看看

create

orreplace

function deter_fun2

return

pls_integer

deterministic

as v_val number

; begin

v_val:=

trunc

(dbms_random.value(0,

999));

dbms_output.put_line(

'訪問flag'

); return v_val;

end deter_fun2; --

只訪問一次

select

*from emp e where e.empno=deter_fun2();

通過執行計畫的遞迴呼叫次數也可以看出來,大家可以驗證

oracle函式 關於日期

日期常用函式 add months,last day,next day,months between,new time,round 函式用法 add months d,n 時間點d加上n個月 示例 select sysdate,add months sysdate,1 from dual 注 sys...

關於Oracle取整的函式

關於oracle取整的函式分別有以下幾種 1.取整 大 select ceil 1.001 value from dual 向大的進製 ceil 0.12 02.取整 小 select floor 1.001 value from dual 向小的進製 floor 0.12 13.取整 擷取 sel...

關於oracle函式listagg的使用說明

工作中經常遇到客戶提出這樣的需求,希望在彙總合併中,能夠把日期逐個列舉出來。如圖,原始資料是這樣的 客戶希望能夠實現這樣的彙總合併 那麼通常我會使用listagg這個函式,但是好多網上都是系統的全面的介紹listagg這個函式的使用方法,看起來很費力氣。在這裡我簡明扼要的說明一下 實現這個需求的語句...