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

问题描述 投票:16回答:8

我在MS SQl服务器2008中使用ISNULL,由于我的表太大,是否使用ISNULL可能会对性能造成任何影响?

提前感谢

sql sql-server sql-server-2008 sql-server-2005
8个回答
11
投票

如果需要使用它,则ISNULL与诸如COALESCE或CASE之类的替代项之间的任何区别都是很小的。不用担心

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

编辑

SELECT列表中的

ISNULL以抑制NULLS是微不足道的。主要工作将在处理行和数据中完成。不能测量额外的ISNULL:请勿optimise prematurely


49
投票
选择子句中的

ISNULL()对性能影响很小。另一方面,由于它阻止了优化程序在该列上使用索引,因此它会对性能产生巨大影响。

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()时,请评估其是否阻止查询优化器使用索引。如果是这样,请考虑使用结果为isull(col1,0)创建一个计算列,并为该计算列建立索引并在您的where子句中使用。


13
投票

是的。对于优化器而言,最好将查询(如果可能)重写为以下形式:

(Field = @x OR @x IS NULL)

由于在某些情况下使用函数,导致优化器无法使用统计信息,有时还会强制进行隐式数据类型转换


1
投票

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


1
投票

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

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

我的猜测是,当您在整个列上运行它时,ISNULL是可以的(例如,在普通的SELECT中)。但是,当您使用OVER运行它时,每次都会重新调用它,从而降低了性能。

不准备进一步深入研究。只需将其放在此处以供他人参考。


0
投票

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

此外,我建议您仔细阅读-What makes a SQL statement sargable?


0
投票

这取决于您的使用方式,但是在两种情况下(带有ISNULL()和不带有它的情况,您都是can build execution plans并比较结果。


0
投票

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

看起来好像它运行子查询,即使check_expression值不是NULL也无济于事。

CASE执行预期。

© www.soinside.com 2019 - 2024. All rights reserved.