1

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

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

这两种方式对我来说都非常快,可以使用执行计划(而且我认为优化器发挥了它的作用)。有没有办法证明他只与没有 IsNull 的 Null 进行比较更有效(除非不是)。

4

2 回答 2

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)并且非常有效。第二个对聚集索引使用索引扫描——它必须查看表中的每一行。

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

于 2013-04-04T10:54:37.707 回答
0

IsNull 不好用,如果你在where子句中使用它并与0比较,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;
于 2013-04-04T10:40:54.273 回答