SQL Server中,“in” 和 “or” 哪个更快?

11

好的,我有一个查询:

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

上述代码和下面这段哪个更快?

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

有没有通用的规则?

谢谢。


你自己没有试过吗? - Neil Knight
3个回答

7

使用INOR都会查询b = 0b = 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

7
据我所知,IN 转换为 OR。因此性能是相同的。只是一种更简洁的写法。

7
希望在这个简单的例子中,使用哪个版本是没有区别的(因为查询优化器应该会在背后将它们转换为等效查询),但是很可能会依赖于你在mytable上有哪些索引。建议你在打开“包括实际执行计划”之后,在Sql Server Management Studio中运行两个查询并比较结果,以确定哪个查询在你的场景中具有最低的“成本”。
操作步骤如下:
1. 将查询放入新的Sql Sever Management Studio查询窗口中 2. 在你输入的空格处右键单击窗口 3. 点击“包括实际执行计划” 4. 像平常一样运行你的查询
现在窗口底部的“结果”半部分将显示第三个选项卡“执行计划”,其中应包含两个“流程图”,一个用于第一个查询,另一个用于第二个查询。如果两个查询相同,则Sql Server将把两个查询视为等效,因此你可以选择自己或者你的同事更喜欢的查询形式。

@harpo,是的,这是我冗长的方式来表达“这是如何让你自己解决问题的方法,因为我知道这样做会让你获得更多的发现”,以回答OP的问题 =) - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接