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)
有一般规则吗?
谢谢
希望在这个简单的示例中,您使用的版本不会有任何区别(因为查询优化器应该将它们转换为引擎盖下的等效查询),但是它很可能依赖于您所使用的索引mytable.我建议您在打开"包含实际执行计划"后在Sql Server Management Studio中运行这两个查询,并比较结果以确定哪个查询在您的方案中具有最低的"成本".
去做这个:
底部"结果"窗口的一半现在将显示第三个选项卡,"执行计划"应包含两个"流程图",一个用于第一个查询,另一个用于第二个查询.如果两者相同,那么Sql Server将这两个查询视为等效,因此您应该选择您和/或您的同事喜欢的任何形式.
双方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
Run Code Online (Sandbox Code Playgroud)