当前位置: 代码迷 >> Sql Server >> 连接查询时,使用where先过滤后联接,还是先联接 最后使用where过滤好
  详细解决方案

连接查询时,使用where先过滤后联接,还是先联接 最后使用where过滤好

热度:80   发布时间:2016-04-24 09:28:58.0
连接查询时,使用where先过滤后连接,还是先联接 最后使用where过滤好?
方法一:这是最后过滤掉 被删除的学生(status 0 未删除,1 已删除)
select * from score t1
inner join student t2 on t1.studentId=t2.id
where t2.status=0;
方法二:先过滤后联结
select * from score t1
inner join (select * from student where status=0) t2 on t1.studentId=t2.id
------解决思路----------------------
你在查询分析器中 按一下 Ctrl + L ,看看执行计划, 两个语句的效率是一样的,最终都转换同样的语句。
------解决思路----------------------
逻辑上,第二种可能要高效,其实不然,SQLSERVER优化器,会提前把条件带入表连接筛选,你的这两个查询,效率上应该是一样的。
------解决思路----------------------
查询优化器会自动进行优化,在连接列有进行条件的筛选时会先进行资料的筛选再进行join的动作
------解决思路----------------------
在我实际使用过程中,多数情况下两者差不多,偶尔第一种快,甚至有时下面的这种方式更快。
select * from (select t1.*, t2.status from score t1
inner join student t2 on t1.studentId=t2.id
) aaa
where status=0;
------解决思路----------------------
抛开数据分布、索引、选择度等一系列问题,先筛选后连接会更好,因为你要处理的数据量理论上更少,但是优化器会根据实际情况选择它认为的最优方式。所以如果实在要选,我个人建议先筛选后连接,另外那些select *,没必要就不要用*号
  相关解决方案