暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL优化案例5-外连接WHERE条件位置优化

Oracle微学堂 2017-11-03
673
优化前:

RBO模式上,可以调整多表之间的先后顺序进行优化,但是在CBO模式上这条优化已经不在适用,但是where条件的位置不同会不会导致SQL效率不一样呢?答案是肯定的,特别是在外连接这种情况下,更为明显,今天在网上看到一个案例,在此总结一该类SQL优化方法

select *
  from (select u.NAME UniversityName,
               u.idUniversityId,
               count(a.SIGNUPNUMBER)playercnt
          from T_B_UNIVERSITYu
          left joinT_D_EDUCATION e
            one.UNIVERSITY_ID = u.id
          left joinT_D_VIDEO_PLAYER a
            ona.USER_ID = e.user_id
           ande.ISDEFAULT = 1
           and e.ISVALID= 1
           anda.AUDITSTATUS = 1
           and a.ISVALID= 1
          left join T_D_USERc
            ona.USER_ID = c.id
           and c.ISVALID= 1
         where u.REGION_CODE like'43%'
         group by u.NAME, u.id)
 order by playercnt desc;

  3 - access("A"."USER_ID"="C"."ID"(+)) 
   4 - filter("C"."ISVALID"(+)=1) 
   6 -access("E"."UNIVERSITY_ID"(+)="U"."ID") 
   7 - filter("U"."REGION_CODE" LIKE'43%') 
  10 - filter("E"."ISVALID"=1 AND"E"."ISDEFAULT"=1) 
  11 -filter("A"."USER_ID"="E"."USER_ID" AND"A"."AUDITSTATUS"=1 AND 
              "A"."ISVALID"=1) 

优化后:

这条SQL优化前需要20秒才能出结果,之所以慢,是因为条件的位置写的有问题,进行了优化,优化后SQL如下:

select * 
  from (select u.NAME UniversityName, 
               u.idUniversityId, 
               count(a.SIGNUPNUMBER)playercnt 
          from T_B_UNIVERSITYu 
          left joinT_D_EDUCATION e 
            one.UNIVERSITY_ID = u.id 
           and e.ISDEFAULT = 1 
           and e.ISVALID= 1
 
          left joinT_D_VIDEO_PLAYER a 
            ona.USER_ID = e.user_id     
           and a.AUDITSTATUS = 1 
           and a.ISVALID= 1
 
          left join T_D_USERc 
            ona.USER_ID = c.id 
           and c.ISVALID = 1 
         whereu.REGION_CODE like '43%' 
         group by u.NAME,u.id) 
 order by playercnt desc;

---------------------------------------------------------------------------------------------  
Predicate Information (identified by operationid): 
---------------------------------------------------  
   3 - access("A"."USER_ID"="C"."ID"(+)) 
   4 - filter("C"."ISVALID"(+)=1) 
   5 -access("A"."USER_ID"(+)="E"."USER_ID") 
   6 - filter("A"."AUDITSTATUS"(+)=1 AND"A"."ISVALID"(+)=1) 
   7 -access("E"."UNIVERSITY_ID"(+)="U"."ID") 
   8 - filter("U"."REGION_CODE" LIKE'43%') 
   9 - filter("E"."ISDEFAULT"(+)=1 AND"E"."ISVALID"(+)=1)

优化后,该SQL执行时间在1秒内即可以出结果,该方法也是优化思路中的一种,在此记录一下!

扫描二维码关注我的微学堂

搜索刘老师微信号:Rman-2014,备注“Oracle学习与咨询”,即可添加好友;或者扫描下面二维码,关注我的“微学堂”公众号,了解最新OCP认证动态、题库及答案解析、培训机构及讲师介绍、课堂授课内容等。每天还有一篇技术文章发布哦!



最后修改时间:2019-12-20 16:40:15
文章转载自Oracle微学堂,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论