在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认证动态、题库及答案解析、培训机构及讲师介绍、课堂授课内容等。每天还有一篇技术文章发布哦!





