SQL有外连接的时候注意过滤条件位置
来源:互联网 发布:网络数据嗅探器 编辑:程序博客网 时间:2024/05/04 21:45
发现了一个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 有外连接的时候,要注意过滤条件的位置,记住啦!!!
0 0
- SQL有外连接的时候注意过滤条件位置
- SQL有外连接的时候注意过滤条件位置
- 关于SQL语句外连接中的过滤条件
- SQL优化经典案例----外连接where条件位置优化
- SQL优化经典案例----外连接where条件位置优化
- SQL:外连接on条件与where条件的区别
- SQL:外连接on条件与where条件的区别
- sql中外连接条件位置不同导致的查询结果不过
- KVM console 连接虚拟机注意的位置
- JOIN ON后面的过滤条件和where后面的过滤条件有什么不同?
- 外连接 ON 条件的三个作用 SQL中on条件与where条件的区别
- 外连接 ON 条件的三个作用 SQL中on条件与where条件的区别
- 外连接 ON 条件的三个作用 SQL中on条件与where条件的区别
- Mysql 与聚合函数在一起时候where条件和having条件的过滤时机
- 怎样在下拉框中显示有过滤条件的数据
- Oracle外连接中对非连接条件使用(+)需要注意的地方
- 定义container元素的时候,有三个条件必须遵守
- 数据库查询,删除,更新条件的时候注意条件是否去除空格!
- ViewFlipper锁屏后工作异常的解决方法
- xp iis
- SelectListItem
- 软件设计的思考
- 手机浏览器将变成“操作系统”?至少Opera是这么认为的
- SQL有外连接的时候注意过滤条件位置
- MyHtmlHelperExt
- YSlow使用指南
- WebDriver- 等待页面加载元素完成
- DemoController.cs
- SAX解析xml学习之爬网工具
- 移除程序的某些权限
- 使用协议在两个页面之间传递数据
- datagridview一些总结