Oracle优化一个视图发现的问题。

--原始视图:

select BLNO,CFS_LOCACCEPTID,LOCACCEPTNO,E_BLID,DELIVERTIMES,UPDATETIME,
UPDATEUSER,ACCEPTTIME,DELIVERYMAN,CARGOQTY,REMARK,NVL(T_LIFT,'未收') as T_LIFT,
NVL(T_MANPOWER,'未收') as T_MANPOWER,
NVL(T_REINFORCE,'未收') as T_REINFORCE,
NVL(T_HUG,'未收') as T_HUG,
NVL(T_HLIFT,'未收') as T_HLIFT from (select (Select blno from e_bl where e_blid=t.e_blid) as blno,cfs_locacceptid,locacceptno,
delivertimes,updatetime,updateuser,accepttime,deliveryman,cargoqty,E_BLID,
remark,(select case NVL(Trim(PAYMODE),'--') when 'M' then '月结' when 'L' then '现结' when '--' then '/' else '/' end
from  cfs_chargedetail where LOCACCEPTNO=t.LOCACCEPTNO and CHARGECODE='T_LIFT' and rownum=1) as T_LIFT,
(select case NVL(Trim(PAYMODE),'--') when 'M' then '月结' when 'L' then '现结'  when '--' then '/'  else '/' end
from  cfs_chargedetail where LOCACCEPTNO=t.LOCACCEPTNO and CHARGECODE='T_MANPOWER' and rownum=1) as T_MANPOWER,
(select case NVL(Trim(PAYMODE),'--') when 'M' then '月结' when 'L' then '现结' when '--' then '/'  else '/' end
from  cfs_chargedetail where LOCACCEPTNO=t.LOCACCEPTNO and CHARGECODE='T_REINFORCE' and rownum=1) as T_REINFORCE,
(select case NVL(Trim(PAYMODE),'--') when 'M' then '月结' when 'L' then '现结' when '--' then '/'  else '/' end
from  cfs_chargedetail where LOCACCEPTNO=t.LOCACCEPTNO and CHARGECODE='T_HUG' and rownum=1) as T_HUG,
(select case NVL(Trim(PAYMODE),'--') when 'M' then '月结' when 'L' then '现结' when '--' then '/'  else '/' end
from  cfs_chargedetail where LOCACCEPTNO=t.LOCACCEPTNO and CHARGECODE='T_HLIFT' and rownum=1) as T_HLIFT
from cfs_locaccept t) WHERE NVL(BLNO,'---')<>'---'

速度慢到11秒才会出数据,优化后的视图:

select BLNO,CFS_LOCACCEPTID,LOCACCEPTNO,E_BLID,DELIVERTIMES,UPDATETIME,
UPDATEUSER,ACCEPTTIME,DELIVERYMAN,CARGOQTY,REMARK,NVL(T_LIFT,'未收') as T_LIFT,
NVL(T_MANPOWER,'未收') as T_MANPOWER,
NVL(T_REINFORCE,'未收') as T_REINFORCE,
NVL(T_HUG,'未收') as T_HUG,
NVL(T_HLIFT,'未收') as T_HLIFT from (select e_bl.blno as blno,cfs_locacceptid,locacceptno,
delivertimes,t.updatetime,t.updateuser,accepttime,deliveryman,t.cargoqty,t.E_BLID,
t.remark,
GetPayModeByCFS_ChargeDeatil(t.LocAcceptNo,'T_LIFT') as T_LIFT,
GetPayModeByCFS_ChargeDeatil(t.LocAcceptNo,'T_MANPOWER') as T_MANPOWER,
GetPayModeByCFS_ChargeDeatil(t.LocAcceptNo,'T_REINFORCE') as T_REINFORCE,
GetPayModeByCFS_ChargeDeatil(t.LocAcceptNo,'T_HUG') as T_HUG,
GetPayModeByCFS_ChargeDeatil(t.LocAcceptNo,'T_HLIFT') as T_HLIFT
from cfs_locaccept t left join e_bl on e_bl.e_blid=t.e_blid );

结论:

 执行视图查询:

   SELECT * FROM view_locacceptweb WHERE  blno= '569622668'  

  如果查询中包含子查询,并且又作为视图的查询条件,就会造成全表扫描。速度非常慢。  尽量使用联查代替子查询。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值