为什么过滤后在联接和联接后再过滤查询成本一样?

leahb 2007-12-24 11:46:55
select * From a Left Join b On a.id=b.id Where c like '1%'
select * From (select * From a Where c like '1%') a Left Join b On a.id=b.id
...全文
84 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawugui 2007-12-24
  • 打赏
  • 举报
回复
只用子查询,每个ID对应连接,应该是一样.

但从查询速度上来说,应该第一个略快.
不过like,这个用不到索引,也许你这两查询时间差不多.
fcuandy 2007-12-24
  • 打赏
  • 举报
回复
也即是说,如果你的where 条件有针对从表过滤的, 那么按第二种写法先用一个子查询,滤一部分记录,再连表, 虽然多了一次编译运算, 但省下来的却是n行的join操作, 效率是提升的.
fcuandy 2007-12-24
  • 打赏
  • 举报
回复
道理很简单.4楼朋友说中了一部分..

再补充一下,主要是a做为了基表,你又使用的left join. 所以先连表再 where 过滤时, 跟先过滤再连表一样的.

因为left join的操作,无论从表有没有匹配的记录,它都不影响基表的行的值.

但是当你反着写一下,就不一样了.

declare @a table(id int,v varchar(10))
insert @a select 1,'a'
union all select 2,'b'

declare @b table(id int,v varchar(10))
insert @b select 1,'a'

select * from @a a left join @b b on a.id=b.id where a.v like 'a%'
select * from (select * from @a where v like 'a%') a left join @b b on a.id=b.id


select * from @a a left join @b b on a.id=b.id where b.v like 'a%'
select * from @a a left join (select * from @b where v like 'a%') b on a.id=b.id
看后面这两句的查询计划比对,就知道了.

当b为从表时,先连表再 where b...
因为它是从表,那么产生行集的对应的b.v值,可能与原表不一样.

而写在子查询里先过滤, 这时还是操作的b表原来的行.
JL99000 2007-12-24
  • 打赏
  • 举报
回复
一样的原因是你的条件Where c like '1%'只对表a有作用
yangjiexi 2007-12-24
  • 打赏
  • 举报
回复

--guan zhu yi xia!
中国风 2007-12-24
  • 打赏
  • 举报
回复
方法二...多了一个嵌套。。


是毫秒差别..

方法二比方法一多一个编译时间

22,294

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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