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的方式访问 ...
一周排行
  • 之前接触的都是,接收客户端的请求,返回响应,用到的都是HttpServletRequest和HttpServletResponse,这两个对象都是服务器封装好的,使用到HttpClient要自己生成请求与响应的对象, ...
  • 作者:小金 来源:chip 细心的读者一定会注意到,在前几期的信息安全文章里,有好几次都提到了"社会工程学"这个词.那么,信息安全中的"社会工程学"到底是什么含义?它有哪些具体 ...
  • 网络设置和PCMCIA   有许多可用的方法来处理 PCMCIA 网络接口的设置(对于 2.4 和 2.6 的内核).   对于 32 位 PCI (CardBus) PCMCIA 网卡: ifupdown 由 ho ...
  • 定义和用法: error_reporting() 设置 PHP 的报错级别并返回当前级别. 函数语法: error_reporting(report_level) 如果参数 level 未指定,当前报错级别将被返回. ...
  • YY's new problem Time Limit: 12000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Sub ...
  •  这篇文章译自 Squirrel Park 的文章 User Experience is King, 作者是 +NINO RAPIN, 由于我已经很久没翻译过文章了, 英文能力过关的同学可以直接去看原文~ 对了, T ...
  • 村民接到通知上山救援 事发野长城位于西栅子村五队西南角山顶,海拔愈千米. 据村民介绍,昨日上午10时许,5名年轻男女前来攀爬野长城,约在中午时分,天空开始下起小雨,其间不停有响雷传来.2个小时后,该村接到通知,有5人 ...
  • 效果图     代码   <Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xml ...
  • 1 html的meta标签 2 3 1.meta标签是内嵌在你网页中的特殊html标签,包含着你有关于你网页的一些隐藏信息.Meat标签的作用是向搜索引擎解释你的网页是有关哪方面信息的.对于高级的搜索引擎来说,htm ...
  •  [7 37 CST] 0000002f ApplicationDe I ApplicationDeploymentController perform ApplicationDep ...