sql server'in'或'或' - 这是最快的

时间:2010-08-18 08:54:53

标签: sql sql-server sql-server-2005

好的,我有一个问题:

select distinct(a)
from mytable
where
b in (0,3)

什么会更快,上面或

select distinct(a)
from mytable
where
b = 0
or
b = 3

是否有一般规则?

由于

3 个答案:

答案 0 :(得分:7)

据我所知,IN会转换为OR。所以性能是一样的。只是一种较短的写作方式。

答案 1 :(得分:6)

希望在这个简单的示例中,您使用哪个版本(因为查询优化器应该将它们转换为引擎盖下的等效查询)不会有任何区别,但是很可能它依赖于您拥有的索引在mytable。我建议您在打开“包含实际执行计划”后在Sql Server Management Studio中运行这两个查询,并比较结果以确定哪个查询在您的方案中具有最低的“成本”。

要做到这一点:

  1. 将您的查询放入新的Sql Sever Management Studio查询窗口
  2. 右键单击您输入的空间中的窗口
  3. 点击“包含实际执行计划”
  4. 像往常一样运行查询
  5. 底部的“结果”窗口的一半现在将显示第三个选项卡,“执行计划”应包含两个“流程图”,一个用于第一个查询,另一个用于第二个查询。如果两者相同,则Sql Server将这两个查询视为等效,因此您应该选择您和/或您的同事喜欢的任何形式。

答案 2 :(得分:5)

INOR都会对b = 0执行查询,然后对b = 3执行一次查询,然后对两个结果集执行合并连接,最后过滤任何重复。

对于IN,重复项确实没有意义,因为b不能同时为03,但事实是IN }将被转换为b = 0 OR b = 3,而OR,重复有意义,因为你可能有b = 0 OR a = 3,如果你要加入两个单独的结果集,您最终可能会为符合这两个条件的每条记录重复。

因此,无论您使用的是IN还是OR,都会始终进行重复过滤。但是,如果您从一开始就知道您不会有任何重复项 - 通常是在您使用IN的情况下 - 那么您可以使用不过滤的UNION ALL获得一些性能重复:

select distinct(a)
from mytable
where
b = 0

UNION ALL

select distinct(a)
from mytable
where
b = 3