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的方式访问 ...
一周排行
  • 引言 在上一篇文章中,我介绍了动态类型以及它的用途,然后顺便提了一下关于如何使用动态类型来实现一个解决方案,但是都过于空洞,那么就让我们通过本文深入到实际的代码中去看看动态类型的实现和调用. 首先简单回顾一下什么是动 ...
  • Log1是一款内容管理系统,Log1的文件管理功能存在多个安全漏洞,可能导致攻击者获取网站shell. [+]info:~~~~~~~~~Vulnerable Web-App : Log1 CMS 2.0  Vuln ...
  • 发布日期:3.10发布作者:asmc 影响版本:5UCMS <= v1.2.2024官方网站:http://www.5u.hk 漏洞类型:SQL注射漏洞 详细说明:最近在测试一个网站时,提交/adm ...
  • 1 (1)  fopen 打开文件函数  (R-只读 W-写入 A-读写)       fopen (路径和文件名,打开方式)  2  fread 读取文件内容 (字节为单位) 3 (3)  filesize 读取文 ...
  • 中国互联网界的风险投资.天使投资.PE.投行 Accel Partners - 投资机构 - 风险投资 - 美国硅谷 Apax Partners(安佰深) - 投资机构 - 风险投资 - 英国 安徽科技投资有限公司  ...
  • 微软将与诺基亚结盟,最快美国时间今天宣布相关计划.由于微软明年推出新版Office,业内纷纷猜测,合作主要集中在诺基亚产品可安装Office软件.诺基亚中国方面昨表示尚未听说此事,微软亦拒绝透露细节.除牵手微软,不久 ...
  • 大家都知道微软的必应搜索引擎首页每天都会提供了一些有趣的图片,而这些图片很多都是有故事含义的,很多网友每天去访问必应首页都是为了这些图片而去的.在全世界,越来越多的白领和学生开始使用微软推出的必应搜索,甚至在美国,必 ...
  • Android学习 之 Bitmap Drawable byte[] 三者之间的转换以及把数组存入数据库及提取数据重新组合成所需对象,如图像 1.创建数据库表的时候选择存图片的字段类型为blob ? StringBu ...
  •  UDP网络程序采用的通信模型与TCP网络程序模型有很大的不同UDP服务器首先进行初始化操作:调用函数socket创建一个数据报类型的套接字,函数bind将这个套接字与服务器的公认地址绑定在一起.然后调用函数recv ...
  • Step 1. ContentResolver.registerContentObserver 这个函数定义在frameworks/base/core/java/android/content/ContentReso ...