oracle语句优化--函数索引
待优化语句执行大概需要一分钟:
select PO.SOURCECODE OT_CUSID,
PO.MERCHANT_NO OT_ACCTNO,
case
when OT.TRAN_NO is null then
ZD.CHECKNO
else
OT.TRAN_NO
end OT_TRAN_NO,
(select DICT_CODE_LOINC
from COM_DICT
where DICT_TYPE = 'CHANNEL_CODE'
and DICT_CODE = OT.CHANNEL_CODE) OT_CHANNEL_CODE,
case
when OT.CHANNELTRANSNO is null then
ZD.CHECKREFNO
else
OT.CHANNELTRANSNO
end OT_CHANNELTRANSNO,
case
when OT.TRAN_NO is null then
ZD.CHECKNO
else
OT.TRAN_NO
end ZD_CHECKNO
from ACC_CHECKBATCHDETAIL ZD
left join (select *
from PAY_ORDERTRANS T
where T.ORDER_STATE in ('05', '02')
and TO_CHAR(T.FINISH_DATE, 'YYYY-MM-DD') = '2019-09-16') OT
on ZD.CHECKNO in
(OT.CHANNELTRANSNO,
OT.BANK_ORGTRANDATE || SUBSTR(OT.CHANNELTRANSNO, -6))
and OT.ORDER_STATE = ZD.TRANSTATE
left join (select *
from PAY_ORDER
where TO_CHAR(ORD_DATE, 'YYYY-MM-DD') = '2019-09-16') PO
on OT.ORDER_NO = PO.ORDER_NO
where TO_CHAR(TRANDATE, 'YYYY-MM-DD') = '2019-09-16';
查看执行计划,发现有两处全表扫描:

- ACC_CHECKBATCHDETAIL
- PAY_ORDERTRANS
对ACC_CHECKBATCHDETAIL的CHECKNO,TRANSTATE字段建索引,执行后效果没有大的改善。
对PAY_ORDERTRANS 的FINISH_DATE字段建函数索引后,执行时间得到大的改善:
create index pk_tochar_date on PAY_ORDERTRANS (TO_CHAR(FINISH_DATE, 'YYYY-MM-DD'));

表PAY_ORDERTRANS 的执行计划改为走索引pk_tochar_date,CPU消耗及IO消耗都降到了原百分之一左右。语句的总执行时间也降到了秒级,于是停止优化。
posted on 2019-09-24 12:48 Digital_life 阅读(596) 评论(0) 收藏 举报
浙公网安备 33010602011771号