oracle创建自定义函数索引,SQL优化案例-自定义函数索引(五)

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 

执行计划如下:

2c569ae411152a2bd841b77f867297da.png

可以看到谓词信息是客户号,可以确定此列选择性非常高,非常适合建立索引。

CREATE INDEX IDX_GETACCTNO ON IC_MERCHTRANSDETAIL_428 (GETACCTNO(ACTSTLACCTNO)) PARALLEL 10 TABLESPACE REPT

*

ERROR at line 1:

ORA-30553: The function is not deterministic

a01140376cb7589c725e4eec3bb800fb.png

确定函数本身不会受到不确定值的影响,创建函数索引。

加上

deterministic

并且取别名,查看函数创建语句:

CREATE OR REPLACE FUNCTION GETACCTNOCY (acct varchar2) return varchar2 DETERMINISTIC

is

tmpacct 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;

创建索引后的执行计划如下:

3709ea9676e8f8dc961786c186676702.png

案例较为简单,希望可以帮助到大家。

|  作者简介

姚崇·沃趣科技高级数据库技术专家

熟悉Oracle数据库内部机制,丰富的数据库及RAC集群层故障诊断、性能调优、OWI、数据库备份恢复及迁移经验。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值