Oracle 多表联查优化

-----------------------------------------未优化代码------------------------------------------------------------------------------

select

A.Gvm_id,

B.B_company_name_cn as deptName,

B1.B_company_name_cn as areaName,

F.F_variGy,

G.GVL_ODOMGER asGvm_now_odomGer

fromG_vehicle_maintenance A

leftjoin G_vehicle F on A.Gvm_F_id=F.F_id

left join (selects.Gvl_F_id, s.GVL_ODOMGER

  from G_vehicle_oil s

 inner join (select Gvo.Gvl_F_id, max(Gvo.create_time)as numG

               from G_vehicle_oil Gvo

              group by Gvo.Gvl_F_id) ss

    on ss.Gvl_F_id = s.Gvl_F_id

   and ss.numG = s.create_time

) G on G.Gvl_F_id =A.Gvm_F_id

leftjoin es_company B on F.F_B_id=B.B_id

leftjoin es_company B1 onB.B_parent_B_id=B1.B_id

where nvl(G.GVL_ODOMGER,0)- nvl(A.Gvm_next_mileage,0)>=0

------------------------------------------优化后代码-------------------------------------------------------------------

select

A.Gvm_id,

B.B_company_name_cn as deptName,

B1.B_company_name_cn as areaName,

F.F_variGy,

G.GVL_ODOMGER asGvm_now_odomGer

from

(selects.Gvl_F_id, s.GVL_ODOMGER

  from G_vehicle_oil s

 inner join (select Gvo.Gvl_F_id, max(Gvo.create_time)as numG

               from G_vehicle_oil Gvo

              group by Gvo.Gvl_F_id) ss

    on ss.Gvl_F_id = s.Gvl_F_id

   and ss.numG = s.create_time

) G

  left join

G_vehicle_maintenance A  on G.Gvl_F_id =A.Gvm_F_id

leftjoin G_vehicle F on A.Gvm_F_id=F.F_id

leftjoin es_company B on F.F_B_id=B.B_id

leftjoin es_company B1 onB.B_parent_B_id=B1.B_id

where nvl(G.GVL_ODOMGER,0) >=  nvl(A.Gvm_next_mileage,0)

-----------------------------------------------总结-----------------------------------------------------------------

第一次运行未优化SQL语句时 运行时间4s    接着第二次运行   卡住  不报错也不显示查询结果

排查错误 发现 不显示查询结果原因出在    nvl(G.GVL_ODOMGER,0)- nvl(A.Gvm_next_mileage,0)>=0 

修改为  nvl(G.GVL_ODOMGER,0) >=  nvl(A.Gvm_next_mileage,0)  运行 显示结果 运行时间8s

运行时间还是太长 接着排查原因  :

查看SQL执行计划 发现花费时间最长的一段是

left join (selects.Gvl_F_id, s.GVL_ODOMGER

  from G_vehicle_oil s

 inner join (select Gvo.Gvl_F_id, max(Gvo.create_time)as numG

               from G_vehicle_oil Gvo

              group by Gvo.Gvl_F_id) ss

    on ss.Gvl_F_id = s.Gvl_F_id

   and ss.numG = s.create_time

) G on G.Gvl_F_id =A.Gvm_F_id

查资料发现使用       lift join 进行多表联查  表的前后顺序会影响SQL的执行效率

果断调整表的联查的顺序 接着运行SQL语句   显示查询结果 运行时间2s   








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tiegenZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值