SQL有外连接的时候注意过滤条件位置

2013年/5月/2日

 

奶奶的,为啥现在五一节只放3天,5月的天气最适合出游了,不过俺们这些苦逼的IT男是没法享受了。

一来到公司,项目经理就找到开发leader,说我们网站 页面很慢,让他排查原因。

一听说 网站慢,页面慢 哥 就来精神了,哥的老本行就是 解决 “慢” 的问题。

开发leader 很郁闷的说,我们已经加了 memcache了,20分钟 cache一次,咋个还是慢呢,

于是哥就问,那个网页跑了哪些SQL? 能抓出来让我看看吗? 开发Leader 果断的把SQL 抓了出来。

经过排查,我们发现了一个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 的问题吗? 这个 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
           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 |     5   (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)
   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要跑至少5秒以上,现在0.1秒能出结果。

 

各位童鞋,SQL 有外连接的时候,要注意过滤条件的位置,记住啦!!!

 

 有SQL 需要优化的 欢迎加入  QQ 群 220761024 申请注明 来自CSDN

 

 

 

更多相关文章
  • 极客头条新版上线近一个月,我们也在前不久开通了博客专家直推极客头条功能,各位专家同学非常活跃积极支持极客头条,特此感谢! 为了了解各位博客专家大牛的亲身使用感悟,为我们日后极客头条产品改进提供重要参考,特举办本次「面向专家」的极客头条使用体验征文活动. 希望各位专家同学尽情地用博文向我们说出您使用极 ...
  • 美国国家情报总监办公室(ODNI)周一宣布称,对于曾经收集的大量美国电话记录,美国国家安全局(NSA)将会限制数据读取并最终销毁. 今年6月通过的联邦法律结束了NSA针对美国公民电话记录的大规模收集,并且规定NSA销毁已经收集的数据,这归功于前NSA雇员斯诺登的泄露带来的全球范围内的广泛争议. 至今 ...
  • 1 常用函数 1.1   socket() int socket(int family, int type, int protocol); socket()打开一个网络通讯端口,如果成功的话,返回一个文件描述符,应用程序可以像读写文件一样用read/write在网络上收发数据,如果socket()调 ...
  • 本文由阿德马翻译自国外网站,尊重劳动成果,转载请注明出处,谢谢. 本文将详细介绍Appscan功能选项设置的细节,适合E文一般,初次接触Appscan的童鞋参考阅读. Appscan是web应用程序渗透测试舞台上使用最广泛的工具之一.它是一个桌面应用程序,它有助于专业安全人员进行Web应用程序自动化 ...
  • 1 我们今日的窘境 1.1 环境 我们所处的环境是一个追求“革命性技术”的业界.公司追求着多.快.好.省地解决问题的捷径,管理者关注的只是软件进度.发布版本.成本和利润,在他们背后,软件缺陷已经埋了下来.专注代码质量的程序员往往不受青睐,因为他们思考的更多,在开发进度方面往往不尽人意.当项目负责人无 ...
  •      小菜今天发现一个比较有意思的事:万网域名.      万网,IT界无人不晓,现已归阿里所属,它的真实域名为:www.www.net.cn.为什么看起来这么奇怪呢,里边大有文章.      平常我们见到的*.com.*.cn.*.net,是顶级域名,但我们习惯于用www.*.com的方式访问 ...
一周排行
  • 最近偶然接触到Highcharts,各种各样的图表,被之深深吸引,接下来将记录下学习Highcharts的历程.
  • 近来我一直在协助一个学校进行一卡通项目和汇文数据库系统结合的二次开发问题,其中自助终端和汇文系统结合紧密.我们成功采取了下面的流程来解决自助终端和一卡通的合作问题,并使参与的三个数据库保持了事务上的准确性,流程图如下 ...
  • 1.图片的名字Btn_Play R文件死了. 1.答:修改图片的名字btn_play R文件活了.
  • 微软Office 365部门最近发布了一个视频广告矛头直指谷歌的拳头邮件产品GMail,这段广告的演员自称"GMail Man",他拆看用户邮件并在其中寻找广告的关键词匹配,微软认为GMail牺牲 ...
  • 声明: 1)本文由我bitpeach原创撰写,转载时请注明出处,侵权必究.     2)本小实验工作环境为Windows系统下的百度云(联网),和Ubuntu系统的hadoop-1(自己提前配好).如不清楚配置 ...
  •      设定ActionBar的样式,是我们必须掌握的技能,在之前我们可能都需要一行一行的写代码,然后在模拟器上测试效果,但是现在我们有个一个很棒的工具来设定样式.设定ActionBar样式的工作从未如此简单过! ...
  • 1.Mysql各引擎的图表 2.MyISAM引擎 MyISAM:这个是旧版默认引擎类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) ...
  • Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中使用就可以弥补反射所损失的性能. Action& ...
  • HTML5使得开发者能为你的网站创建出惊人的动画效果.这些很棒的动画效果会为你的网站增添更多吸引力,接着会带来更多的生意.这些用HTML5创建的动画效果很出色,看起来很惊人.但为了做出这种动画效果,你需要经历很多比较 ...
  • 转载地址:http://blog.csdn.net/gf771115/article/details/6293399?reload import java.text.SimpleDateFormat; import ...