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

Blo*_*tac 9 sql sql-server sql-server-2005

好的,所以我有一个问题:

select distinct(a)
from mytable
where
b in (0,3)
Run Code Online (Sandbox Code Playgroud)

什么会更快,上面或

select distinct(a)
from mytable
where
b = 0
or
b = 3
Run Code Online (Sandbox Code Playgroud)

有一般规则吗?

谢谢

Har*_*non 7

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


Rob*_*Rob 6

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

去做这个:

  1. 将您的查询放入新的Sql Sever Management Studio查询窗口
  2. 右键单击您键入的空间中的窗口
  3. 点击"包含实际执行计划"
  4. 像往常一样运行查询

底部"结果"窗口的一半现在将显示第三个选项卡,"执行计划"应包含两个"流程图",一个用于第一个查询,另一个用于第二个查询.如果两者相同,那么Sql Server将这两个查询视为等效,因此您应该选择您和/或您的同事喜欢的任何形式.


Dav*_*und 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
Run Code Online (Sandbox Code Playgroud)