SQL優化案例 自定義函式索引(五)

2021-08-21 21:25:59 字數 2437 閱讀 9796

sql文字如下,表本身很小,走全表掃瞄也很快,但因業務重要性,要求盡可能縮短查詢時間(為保證客戶隱私,已經將注釋和文字部分去掉):

select merchcode as r_merchcode,

trandate,

trantime,

trantype as transtype,

traceno,

posid as r_posid,

account as r_cardno,

amt,

fee,

nvl(reserved1,'n') bordercardbusiflag,

case when i.bancsretflag='0000' then '1'

when i.bancsretflag='9999' then'0'

else '2' end as returncode

from ic_merchtransdetail_428 i

where

getacctno(actstlacctno)=getacctno('14250000000454865') and rownum < 500;

執行計畫如下:

可以看到謂詞資訊是客戶號,可以確定此列選擇性非常高,非常適合建立索引。

確定函式本身不會受到不確定值的影響,建立函式索引。

加上deterministic並且取別名,檢視函式建立語句:

create or replace function getacctnocy (acct varchar2) return varchar2 deterministic

istmpacct varchar2(40);

st_res varchar2(40); --st_res:=tmpacct

begin

tmpacct:='';

st_res :='';

if (length(trim(acct))=16) then

begin

select account

into tmpacct

from link_l

where link_l.card=lpad(trim(acct),20,0)

and iso_type='1'

and category='0';

exception

when no_data_found then

tmpacct:=trim(acct);

end;

end if;

if(length(trim(acct))>17) then

begin

select zh

into tmpacct

from load_zhmap

where jzh=trim(acct);

exception

when no_data_found then

tmpacct:='';

end;

end if;

if(length(trim(acct))=17) then

tmpacct:=substr(acct,1,16);

end if;

st_res:=tmpacct;

return st_res;

exception

when others then

return '';

end;

建立索引:

create index idx_getacctno on ic_merchtransdetail_428 (getacctnocy(actstlacctno)) tablespace tbsidx;
建立索引後的執行計畫如下:

案例較為簡單,希望可以幫助到大家。

姚崇·沃趣科技高階資料庫技術專家

熟悉oracle資料庫內部機制,豐富的資料庫及rac集群層故障診斷、效能調優、owi、資料庫備份恢復及遷移經驗。

SQL自定義函式

建立使用者自定義函式 標量函式 create function dbo.bmrs bmh as int returns int asbegin declare bmrs int select bmrs count 工號 from 銷售人員where 部門號 bmh return bmrs endgo...

sql 自定義函式

delimiter create definer function woshow try aid bigint returns bigint 20 language sql not deterministic sql security comment string begin if aid 0 th...

SQL自定義函式

自定義函式與儲存過程的區別 存在的意義 1.能夠在select等sql語句中直接使用自定義函式,儲存過程不行。2.自定義函式可以呼叫其他函式,也可以呼叫自己 遞迴 3.可以在表列和check 約束中使用自定義函式來實現特殊列或約束 4.自定義函式不能有任何 函式 是指對具有函式外作用域 例如資料庫表...