在SQL Server中使用ISNULL()时是否存在任何性能问题?

kbv*_*hnu 15 sql sql-server sql-server-2005 sql-server-2008

ISNULL在MS SQl服务器2008中使用,因为我的表太大了,是否使用ISNULL可能会对性能产生任何影响?

提前致谢

小智 49

select子句中的ISNULL()对性能的影响可以忽略不计.另一方面,在where子句中,它会对性能产生非常大的影响,因为它会阻止优化器在该列上使用索引.

where isnull(col1, 0) = 0 -- unable to use index, because every 
                          -- row has to be evaluated

where col1 = isnull(@myVar, 0) -- index will be used, since isnull(@myVar, 0) 
                               -- returns the same static value for every row and 
                               -- not every row has to be evaluated by the function.
Run Code Online (Sandbox Code Playgroud)

因此,在where子句中使用isnull()时,请评估它是否阻止查询优化器使用索引.如果是这样,考虑创建一个带有结果的计算列,如果是isnull(col1,0)并索引计算列并在where子句中使用它.

  • 请注意,这两个条件不会给出相同的结果。 (2认同)

Ole*_*Dok 13

是的,它可以.对于优化器,最好重写查询(如果可能)以形成

(Field = @x OR @x IS NULL)
Run Code Online (Sandbox Code Playgroud)

因为在某些情况下使用函数会阻止优化器使用统计信息,有时会强制使用隐式数据类型转换

  • 在您的情况下,使用ISNULL的效果可以忽略不计 (2认同)

gbn*_*gbn 11

如果你需要使用它,那么ISNULL和COALESCE或CASE之类的替代品之间的任何差异都是微不足道的.别担心

任何差异都来自于如何处理数据类型.COALESCE/CASE可以添加隐式数据类型转换,而ISNULL具有更简单的规则.

编辑

禁止NULLS的SELECT列表中的ISNULL是微不足道的.主要工作将在处理行和数据时完成.额外的ISNULL将无法衡量:不要过早优化

  • 根据这篇文章的另一个答案,ISNULL函数在用于WHERE或JOIN子句的SELECT vs中使用时具有明显不同的性能配置文件.我的经验证实了这一点. (2认同)