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

时间:2012-01-19 11:00:10

标签: sql sql-server sql-server-2008 sql-server-2005

我在MS SQl服务器2008中使用ISNULL,因为我的表太大了,是否使用ISNULL可能会导致性能下降?

提前致谢

8 个答案:

答案 0 :(得分:48)

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.

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

答案 1 :(得分:12)

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

(Field = @x OR @x IS NULL)

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

答案 2 :(得分:11)

如果您需要使用它,那么ISNULL与COALESCE或CASE等替代品之间的任何差异都是微不足道的。不要担心

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

修改

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

答案 3 :(得分:1)

避免在where子句中使用isNull。请参阅This article

答案 4 :(得分:1)

是的,在SQL Server Studio 2012中存在性能问题。

当我将ISNULLOVER结合使用时,问题非常明显。优化后(即将ISNULL放入我正在使用OVER的子查询中),运行时间从(估计的)25.2小时减少到102秒。

当您在整个列上运行时,我的猜测是ISNULL是正常的(例如,在普通的' SELECT中)。但是当你用OVER运行它时,每次都会重新调用它,从而拖累性能。

尚未准备好进一步向下钻取。只需将其放在其他地方'参考

答案 5 :(得分:1)

请注意是否将ISNULL与子查询一起用作replace_value。

即使check_expression值不为NULL,它似乎也可以运行子查询,这对性能没有帮助。

CASE的表现符合预期。

答案 6 :(得分:0)

正如已经提到的,它取决于您在查询中使用它的方式和位置。可能您可能希望在查询中显示您使用它的方式。

我还建议你仔细研究一下 - What makes a SQL statement sargable?

答案 7 :(得分:0)

这取决于你如何使用它,但在这两种情况下你都是can build execution plans(使用ISNULL()而没有它)并比较结果。