这两个SQL哪个快,先join后where和先where后join

newlive003 2010-03-18 10:33:45

SELECT a.TT_ID,A.TT_TAG,b.* FROM
(SELECT * FROM New_TopicTag WHERE TT_Tag='维修')as a
INNER JOIN New_Topic as b ON a.Tpc_ID = b.Tpc_ID

--2 sql
SELECT a.TT_ID,A.TT_TAG,b.* FROM New_TopicTag AS A
INNER JOIN New_Topic as b ON a.Tpc_ID = b.Tpc_ID
where a.TT_Tag='维修'
...全文
1768 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
lijt1987 2010-03-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yuguo02615 的回复:]
第一个。要比第二个快。在记录不超过一万条是看不出来的。一但超过一万条,就是明显看出来的。可以建立表后不建立索引。这样就能看出来的。
----------------------
第一个是先过滤,子集与另一子集相关联
第二个是先关联。再过滤。
------------------------
如果SELECT count(*) FROM New_TopicTag WHERE TT_Tag=……
[/Quote]

我觉得,如果在有主外键情况下,是一样的
如果先where,where 里包含<> ,NOT IN, IS NULL等东西的话,会进行全表扫描,将会更慢。
ncufunk 2010-03-21
  • 打赏
  • 举报
回复
我的经验是,使用先where 再join 要比先join 后where 要快。

我使用的表,记录都有好几万,几十万条的记录的。
wangxianshou 2010-03-21
  • 打赏
  • 举报
回复
数据量大的话,第一个比第二个快
happy664618843 2010-03-21
  • 打赏
  • 举报
回复
第二种 好啊
流氓兔 2010-03-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 shenliang1985 的回复:]
SQL code


从执行计划上看无论在ON后的字段上加索引与否,三者的结果同样.

测试可以放在JOIN的物理操作符上.

0)
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO

1)
SELECT s.v_name,spj.* FROM
(SELECT * FROM spj WHERE qty = 100) AS……
[/Quote]
三种方式如果的INNER JOIN 产生的查询计划是一样的!
lao_bulls 2010-03-21
  • 打赏
  • 举报
回复
学习一下啊
老黎 2010-03-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 newlive003 的回复:]
SQL code

SELECT a.TT_ID,A.TT_TAG,b.* FROM
(SELECT * FROM New_TopicTag WHERE TT_Tag='维修')as a
INNER JOIN New_Topic as b ON a.Tpc_ID = b.Tpc_ID

--2 sql
SELECT a.TT_ID,A.TT_TAG,b.* FROM Ne……
[/Quote]
刚学SQL时,我喜欢第一种写法
后来都是用第二种了
ShenLiang2025 2010-03-20
  • 打赏
  • 举报
回复


从执行计划上看无论在ON后的字段上加索引与否,三者的结果同样.

测试可以放在JOIN的物理操作符上.

0)
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO

1)
SELECT s.v_name,spj.* FROM
(SELECT * FROM spj WHERE qty = 100) AS spj
INNER JOIN s ON s.id = spj.id
OPTION (MERGE JOIN)
--OPTION (HASH JOIN)
--OPTION (LOOP JOIN)


蝈蝈王 2010-03-19
  • 打赏
  • 举报
回复
第一个。要比第二个快。在记录不超过一万条是看不出来的。一但超过一万条,就是明显看出来的。可以建立表后不建立索引。这样就能看出来的。
----------------------
第一个是先过滤,子集与另一子集相关联
第二个是先关联。再过滤。
------------------------
如果SELECT count(*) FROM New_TopicTag WHERE TT_Tag='维修' 和SELECT count(*) FROM New_TopicTag 相等,或相差不是那么大的话。那么第二个要比第一个快。
sql_sf 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ldslove 的回复:]
引用 4 楼 dengxingjie 的回复:
SQL code

--3 sql
SELECT a.TT_ID,A.TT_TAG,b.* FROM New_TopicTag AS A
INNER JOIN New_Topic as b ON a.Tpc_ID = b.Tpc_ID and a.TT_Tag='维修'


大家看看第3種情況與前兩2種有沒有性能及結果差別?


……
[/Quote]
结果集是一样的
在left join right join
on

on
where
是有区别的
yinqi025 2010-03-19
  • 打赏
  • 举报
回复
应该第二个会快一点 你自己看一下运行计划看看
feixianxxx 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ldslove 的回复:]
引用 4 楼 dengxingjie 的回复:
SQL code

--3 sql
SELECT a.TT_ID,A.TT_TAG,b.* FROM New_TopicTag AS A
INNER JOIN New_Topic as b ON a.Tpc_ID = b.Tpc_ID and a.TT_Tag='维修'


大家看看第3種情況與前兩2種有沒有性能及結果差別?


……
[/Quote]
你确定结果集不一样么。。。
它是内链接。。。
所以结果集一样的吧。。

外连接才不一样
Mr_Nice 2010-03-19
  • 打赏
  • 举报
回复
觉得第二个可能会快些。看执行计划吧!
东那个升 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dengxingjie 的回复:]
SQL code

--3 sql
SELECT a.TT_ID,A.TT_TAG,b.* FROM New_TopicTag AS A
INNER JOIN New_Topic as b ON a.Tpc_ID = b.Tpc_ID and a.TT_Tag='维修'


大家看看第3種情況與前兩2種有沒有性能及結果差別?
[/Quote]

怎么没区别,结果集都不一样。
feixianxxx 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dengxingjie 的回复:]
SQL code

--3 sql
SELECT a.TT_ID,A.TT_TAG,b.* FROM New_TopicTag AS A
INNER JOIN New_Topic as b ON a.Tpc_ID = b.Tpc_ID and a.TT_Tag='维修'


大家看看第3種情況與前兩2種有沒有性能及結果差別?
[/Quote]
和第二种没区别。。。。
bancxc 2010-03-19
  • 打赏
  • 举报
回复
恩 恩 恩
jiujiuyaokan 2010-03-19
  • 打赏
  • 举报
回复
同时选中这两个语句 然后Ctrl+L 你就能看到结果了...
--小F-- 2010-03-18
  • 打赏
  • 举报
回复
具体可以看执行计划..

不过一般来说建议用连接 比较好加索引
SQL77 2010-03-18
  • 打赏
  • 举报
回复
你查看执行计划,应该一样的
dawugui 2010-03-18
  • 打赏
  • 举报
回复
我认为第二个快.毕竟第一个使用了子查询.

加载更多回复(1)

34,593

社区成员

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

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