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的方式访问 ...
一周排行
  • 外界熟悉的那个百度正在变得陌生,其实这不是坏事.搜索引擎的故事已经讲了15年,是时候展开新篇章了.在最近的财报电话会议上,李彦宏再次强调了O2O业务对集团长期增长的重要性,甚至将其上升到发展出一个"新百度& ...
  • 昨天在和一位朋友讨论到委托与接口的问题,一开始我觉得很不可思议,这两个东西的概念怎么会混淆呢?要混淆也是接口和抽象类,委托和事件相混淆啊!但是着我的一个例子我马上意识到很有可能因为我将要表现的这个例子,让很多朋友混淆 ...
  • Double-Checked Locking失败. 不光CPU支持乱序执行,现在的很多编译器也开始做乱序优化,而且重心有逐渐从硬件转到软件的趋势. 有两篇资料可以参看:Scaling Itanium® Archite ...
  • 此演示xml和DTD在一个文件中 book.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE 书架 [ ...
  • 昨天: 创建了工程hello world 了解了工程下的文件 对R.java和一些重要的文件有了了解 添加控件对layout文件夹下的文件有了了解 对apk的安装有所了解 对/data和/system文件有了初步的了 ...
  • 1.代码 2.编译及运行   1.目录结构 1.1) 1 $ tree 2 . 3 ├── mplayer.go 4 └── src 5 ├── mlib 6 │   ├── manager.go 7 │   └── ...
  • 一.概述 当VMware vSphere基础架构搭建好后,如何把现有跑在物理机上的应用迁移到虚拟机上呢?这就需要请出VMware vCenter Converter这个工具,此工具可以实现P2V(物理机在线或离线迁移 ...
  • 最近被闹得沸沸扬扬的中国宽带垄断事件以中国联通和中国电信双双发表声明表示将会自查,同时将会大幅提升网速降低网费而告一段落,但目前中国的网速到底是处于一个什么样的水平呢?据奇虎360正在举行的"拼网速&quo ...
  •         曾几何时通过IP获取相应所在地的地址一直是一个梦想,曾经为止努力过,但效果并不是很好,现在将努力的成果(某些来源于网络)粘贴出来,希望对某些人有所启发,倘若有人有新的见解,还望不惜赐教:       ...
  • 问题: 出现“编码 UTF-8 的不可映射字符解决方法”的本质原因是代码和本地环境的编码不一致,根据提示可以定位到在ant编译的build文件,build.xml中的encoding与代码的不一致.