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.自定義函式不能有任何 函式 是指對具有函式外作用域 例如資料庫表...