SQL优化经典案例----外连接where条件位置优化

SQL优化经典案例----外连接where条件位置优化

 
---转载http://blog.sina.com.cn/s/blog_61cd89f60102efc9.html

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

select *
  from (select u.NAME UniversityName,
               u.id UniversityId,
               count(a.SIGNUPNUMBER) playercnt
          from T_B_UNIVERSITY u
          left join T_D_EDUCATION e
            on e.UNIVERSITY_ID = u.id
          left join T_D_VIDEO_PLAYER a
            on a.USER_ID = e.user_id
           and e.ISDEFAULT = 1
           and e.ISVALID = 1
           and a.AUDITSTATUS = 1
           and a.ISVALID = 1
          left join T_D_USER c
            on a.USER_ID = c.id
           and c.ISVALID = 1
         where u.REGION_CODE like '43%'
         group by u.NAME, u.id)
 order by playercnt desc;

执行计划信息:

---------------------------------------------------------- 
Plan hash value: 3938743742  
-------------------------------------------------------------------------------------------- 
| Id  | Operation               | Name             | Rows  | Bytes | Cost (%CPU)| Time     | 
-------------------------------------------------------------------------------------------- 
  0 | SELECT STATEMENT        |                  |   142 | 10366 |   170   (3)| 00:00:03 | 
  1 |  SORT ORDER BY          |                  |   142 | 10366 |   170   (3)| 00:00:03 | 
  2 |   HASH GROUP BY         |                  |   142 | 10366 |   170   (3)| 00:00:03 | 
|*  3 |    HASH JOIN RIGHT OUTER|                  |   672 | 49056 |  168   (2)| 00:00:03 | 
|*  4 |     TABLE ACCESS FULL   | T_D_USER         |   690 |  5520 |     5   (0)| 00:00:01 | 
  5 |     NESTED LOOPS OUTER  |                  |   672 | 43680 |  162   (1)| 00:00:02 | 
|*  6 |      HASH JOIN OUTER    |                  |   672 | 37632 |    14   (8)| 00:00:01 | 
|*  7 |       TABLE ACCESS FULL | T_B_UNIVERSITY   |    50 |  2050 |     8  (0)| 00:00:01 | 
  8 |       TABLE ACCESS FULL | T_D_EDUCATION    |   672 | 10080 |     5  (0)| 00:00:01 | 
  9 |      VIEW               |                  |    1 |     9 |     0   (0)| 00:00:01 | 
|* 10 |       FILTER            |                  |            |            |          | 
|* 11 |        TABLE ACCESS FULL| T_D_VIDEO_PLAYER |     1 |    15 |     3  (0)| 00:00:01 | 
--------------------------------------------------------------------------------------------
  
Predicate Information (identified by operation id): 
---------------------------------------------------  
   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.id UniversityId, 
               count(a.SIGNUPNUMBER) playercnt 
          from T_B_UNIVERSITY u 
          left join T_D_EDUCATION e 
            on e.UNIVERSITY_ID = u.id 
           and e.ISDEFAULT = 1 
           and e.ISVALID = 1
 
          left join T_D_VIDEO_PLAYER a 
            on a.USER_ID = e.user_id     
           and a.AUDITSTATUS = 1 
           and a.ISVALID = 1
 
          left join T_D_USER c 
            on a.USER_ID = c.id 
           and c.ISVALID = 1 
         where u.REGION_CODE like '43%' 
         group by u.NAME, u.id) 
 order by playercnt desc;

优化后执行计划信息如下:

---------------------------------------------------------- 
Plan hash value: 2738827747  
--------------------------------------------------------------------------------------------- 
| Id  | Operation                | Name             | Rows  | Bytes | Cost (%CPU)| Time     | 
--------------------------------------------------------------------------------------------- 
  0 | SELECT STATEMENT         |                  |   142 | 11218 |    25  (16)| 00:00:01 | 
  1 |  SORT ORDER BY           |                  |   142 | 11218 |    25  (16)| 00:00:01 | 
  2 |   HASH GROUP BY          |                  |   142 | 11218 |    25  (16)| 00:00:01 | 
|*  3 |    HASH JOIN RIGHT OUTER |                  |   301 | 23779 |   23   (9)| 00:00:01 | 
|*  4 |     TABLE ACCESS FULL    | T_D_USER         |   690 |  5520 |      (0)| 00:00:01 | 
|*  5 |     HASH JOIN RIGHT OUTER|                  |   301 | 21371 |    17   (6)| 00:00:01 | 
|*  6 |      TABLE ACCESS FULL   | T_D_VIDEO_PLAYER |    78 |  1170 |     3  (0)| 00:00:01 | 
|*  7 |      HASH JOIN OUTER     |                  |   301 | 16856 |    14   (8)| 00:00:01 | 
|*  8 |       TABLE ACCESS FULL  | T_B_UNIVERSITY   |    50 |  2050 |     8  (0)| 00:00:01 | 
|*  9 |       TABLE ACCESS FULL  | T_D_EDUCATION    |   301 |  4515 |     5  (0)| 00:00:01 | 
---------------------------------------------------------------------------------------------  
Predicate Information (identified by operation id): 
---------------------------------------------------  
   3 - access("A"."USER_ID"="C"."ID"(+)) 
   4 - filter("C"."ISVALID"(+)=1) 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值