我们的程序员之一倾向于在MS SQL中使用isnull来与NULL进行比较。
这不是写Where ColumnName Is Null
而是写Where IsNull(ColumnName,0)=0
我认为优化器无论如何都会将后者转换为前者,但如果没有 - 是否有办法证明后者效果较差,因为它 1.与null比较, 2.转换为整数, 3.比较2个整数 而不是仅仅与null比较。
对于我来说,能够使用执行计划的两种方式都非常快(而且我认为,优化器也会发挥作用)。有没有办法证明他只是在没有IsNull的情况下与Null比较更有效(除非事实并非如此)。
答案 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;