请问多表联合查询的select语句中限制条件语句放在where后面和放在on后面的执行效率有无差别

lanshi 2009-06-03 09:49:46
比如以下两个SQL语句
语句1: select *
from tab1 a
inner join tab2 b
on a.col1 = b.col1
where a.col2 = 'a'
语句2: select *
from tab1 a
inner join tab2 b
on a.col2 = 'a'
and a.col1 = b.col1
这两个语句执行的结果一样,请问各位高手这两个语句的执行效率有何差异,还是都一样,有无理论依据?
还有语句中where或on后面的条件语句的顺序对执行效率有无影响,比如把语句2改成下面的样子
select *
from tab1 a
inner join tab2 b
on a.col1 = b.col1
and a.col2 = 'a'
效率会有不同吗?请各位高手尽量详细指教,谢谢。
...全文
1495 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fuhaowan1 2009-12-18
  • 打赏
  • 举报
回复
学习中……原来是一样的啊
lanshi 2009-06-05
  • 打赏
  • 举报
回复
多谢各位的回复,我比较赞同Tomzzu这位老兄的说法,我也实际验证过,那三种方式的执行效率应该是一样的,十分感谢。
ai_li7758521 2009-06-04
  • 打赏
  • 举报
回复
执行顺序中每一步基本都会生成临时子表,这些子表的大小就是影响语句速度的关键。
至于你上面的几个语句哪个好坏,不能一概而论,要具体分析,这和你的原表中的数据多少有关。
SQL77 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fredrickhu 的回复:]
引用 3 楼 Tomzzu 的回复:
三种写法是一样的
因为三种写法只是语法上等效变换而已, MSSQL在执行SQL前会先去SQL预编译, 并且进行优化, 把等效的语法最终解析成一种执行计划
inner join ...on ...where 的语句, 条件无论放在on后还是where后, 最终执行的方法及利用的资源都是一样的

具体数据指标详情, 可在查询分析器中 菜单->查询->显示估计的执行计划(CTRL+L)

总结得不错 不过每个人都有总结的习惯 我觉得有时候…
[/Quote]
个人习惯!!呵呵
ai_li7758521 2009-06-04
  • 打赏
  • 举报
回复
SQL Select语句完整的执行顺序: 

1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序。


(8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
youzhj 2009-06-04
  • 打赏
  • 举报
回复
我来学习的。
crystalbright 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ai_li7758521 的回复:]
SQL codeSQL Select语句完整的执行顺序:

1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序。


(8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> J…
[/Quote]
顶你个肺
--小F-- 2009-06-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Tomzzu 的回复:]
三种写法是一样的
因为三种写法只是语法上等效变换而已, MSSQL在执行SQL前会先去SQL预编译, 并且进行优化, 把等效的语法最终解析成一种执行计划
inner join ...on ...where 的语句, 条件无论放在on后还是where后, 最终执行的方法及利用的资源都是一样的

具体数据指标详情, 可在查询分析器中 菜单->查询->显示估计的执行计划(CTRL+L)
[/Quote]
总结得不错 不过每个人都有总结的习惯 我觉得有时候是习惯问题
Tomzzu 2009-06-03
  • 打赏
  • 举报
回复
三种写法是一样的
因为三种写法只是语法上等效变换而已, MSSQL在执行SQL前会先去SQL预编译, 并且进行优化, 把等效的语法最终解析成一种执行计划
inner join ...on ...where 的语句, 条件无论放在on后还是where后, 最终执行的方法及利用的资源都是一样的

具体数据指标详情, 可在查询分析器中 菜单->查询->显示估计的执行计划(CTRL+L)

ks_reny 2009-06-03
  • 打赏
  • 举报
回复
ctrl+L 看执行计划。
zhangxdd 2009-06-03
  • 打赏
  • 举报
回复
应该是第一句好

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧