2012-08-07 65 views
3

假设我有一个T-SQL语句:T-SQL不等于运营商VS Case语句

select * from MyTable 
where Code != 'RandomCode' 

我一直在负责制作这种WHERE语句更快速地执行。联机丛书表示,正面查询(=)比负面(= =,<>)更快。

因此,一种选择是将其变为CASE语句,例如,

select * from MyTable 
where 
    case when Code = 'RandomCode' then 0 
     else 1 end = 1 

有谁知道这是否可以预期会比原来的T-SQL更快或更慢?

在此先感谢。

+0

我没有看到!=会比=慢,除了解析器中有额外的额外开销字符。最后,在cpu级别,这是一个单一的'cmp'类型的指令,之后有'jmp/je/jne'跳转。如果这1个字节对你的代码产生了巨大的影响,那么无论你在做什么都远远高于本网站的水平。 – 2012-08-07 04:19:20

+1

使用查询计划分析器来检查或分析器。 – 2012-08-07 04:20:24

+0

我非常赞同上述两种观点。也就是说,'CASE'选项看起来过于复杂。有条件的地方应该避免使用条款,因为它们可能会使查询计划分裂(不是在这种情况下 - 不是双关语意图)。 – 2012-08-07 04:24:29

回答

6

您必须更具体地了解您对表格感兴趣的信息以及Code列的可能值。然后,您可以创建适当的索引以加快查询速度。

SELECT * FROM MyTable WHERE Code = 'OtherCode' OR Code = 'YetAnotherCode' 

当然,你需要对Code指数:

例如,如果在Code列的值只能是'RandomCode'之一,'OtherCode''YetAnotherCode',您可以重新编写查询柱。

如果你要做一个不平等的查询,您可以更改SELECT *像更窄的查询:

SELECT Id, Name, Whatever FROM MyTable WHERE Code != 'RandomCode' 

然后创建一个索引:

CREATE INDEX idx_Code ON MyTable(Code) INCLUDE (Id,Name,Whatever) 

这样可以减少I/O通过用索引扫描替换表扫描。

+0

谢谢,这非常有帮助。 – Mikaere 2012-08-07 22:46:41