什么更快(Field不为null或Field不为null)或(isnull(field,0)+ isull(field,0)!= 0)?

时间:2018-11-13 17:06:09

标签: sql-server tsql

我只想处理具有至少一个带有值的字段的行。

带有像这样的表

create table #Temp
(
    Id int,
    cnt1 int,
    cnt2 int,
    cnt3 int,
    cnt4 int,
    cnt5 int
)

以下两个查询中哪个查询更快?

select 
    *
from
    #Temp
where
    (cnt1 is not null or cnt2 is not null or cnt3 is not null or cnt4 is not null or cnt5 is not null)

select 
    *
from
    #Temp
where
    isnull(cnt1,0) + isnull(cnt2,0) + isnull(cnt3,0) + isnull(cnt4,0) + isnull(cnt5,0) != 0

我不希望所有字段都等于零的结果,所以第二个查询对我来说不是问题。

此外,是否有更好的方法(更易于阅读)来进行任一查询?

2 个答案:

答案 0 :(得分:2)

我认为不会有一个真正的“好”查询。无论您做什么,它仍然等于一系列OR条件,并且很少能很好地运行。我建议这样做:

select 
    *
from
    #Temp
where coalesce(cnt1, cnt2, cnt3, cnt4, cnt5) is not null

但是您应该使用实际数据,资源,索引和负载在数据库上尝试,并查看哪种方法最有效。

答案 1 :(得分:2)

第一个查询可查询,第二个查询不可。

这意味着如果SQL Server可以使用任何索引来优化查询,它可以将它们与第一个问题一起使用,但不能与第二个问题一起使用,在这种情况下,第一个问题会更快

没有相关索引,您应该race your horses(如蒂姆在其评论中所写)。