好的,我有一个问题:
select distinct(a)
from mytable
where
b in (0,3)
什么会更快,上面或
select distinct(a)
from mytable
where
b = 0
or
b = 3
是否有一般规则?
由于
答案 0 :(得分:7)
据我所知,IN
会转换为OR
。所以性能是一样的。只是一种较短的写作方式。
答案 1 :(得分:6)
希望在这个简单的示例中,您使用哪个版本(因为查询优化器应该将它们转换为引擎盖下的等效查询)不会有任何区别,但是很可能它依赖于您拥有的索引在mytable
。我建议您在打开“包含实际执行计划”后在Sql Server Management Studio中运行这两个查询,并比较结果以确定哪个查询在您的方案中具有最低的“成本”。
要做到这一点:
底部的“结果”窗口的一半现在将显示第三个选项卡,“执行计划”应包含两个“流程图”,一个用于第一个查询,另一个用于第二个查询。如果两者相同,则Sql Server将这两个查询视为等效,因此您应该选择您和/或您的同事喜欢的任何形式。
答案 2 :(得分:5)
IN
和OR
都会对b = 0
执行查询,然后对b = 3
执行一次查询,然后对两个结果集执行合并连接,最后过滤任何重复。
对于IN
,重复项确实没有意义,因为b
不能同时为0
和3
,但事实是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