通过使用isnull将值转换为常量来比较null

时间:2013-04-04 10:36:53

标签: sql-server null isnull

我们的程序员之一倾向于在MS SQL中使用isnull来与NULL进行比较。 这不是写Where ColumnName Is Null而是写Where IsNull(ColumnName,0)=0

我认为优化器无论如何都会将后者转换为前者,但如果没有 - 是否有办法证明后者效果较差,因为它 1.与null比较, 2.转换为整数, 3.比较2个整数 而不是仅仅与null比较。

对于我来说,能够使用执行计划的两种方式都非常快(而且我认为,优化器也会发挥作用)。有没有办法证明他只是在没有IsNull的情况下与Null比较更有效(除非事实并非如此)。

2 个答案:

答案 0 :(得分:2)

另一个明显的问题是ISNULL排除了索引的使用。

运行此设置:

create table T1 (
    ID int not null primary key,
    Column1 int null
)
go
create index IX_T1 on T1(Column1)
go
declare @i int
set @i = 10000
while @i > 0
begin
    insert into T1 (ID,Column1) values (@i,CASE WHEN @i%1000=0 THEN NULL ELSE @i%1000 END)
    set @i = @i - 1
end
go

然后启用执行计划并运行以下命令:

select * from T1 where Column1 is null
select * from T1 where ISNULL(Column1,0)=0

第一个使用索引搜索(使用IX_T1)并且非常有效。第二个在聚簇索引上使用索引 scan - 它必须查看表中每个行。

在我的机器上,第二个查询占用了90%的时间,前10%。

答案 1 :(得分:0)

如果在where子句中使用IsNull并将其与0进行比较,则使用IsNull并不是很好,使用isnull来替换值null

http://msdn.microsoft.com/en-us/library/ms184325.aspx

例如:

SELECT Description, DiscountPct, MinQty, ISNULL(MaxQty, 0.00) AS 'Max Quantity'
FROM Sales.SpecialOffer;