在建立函式索引的時候,自定義的函式需要加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這個函式的使用方法,看起來很費力氣。在這裡我簡明扼要的說明一下 實現這個需求的語句...