我在MS SQl服务器2008中使用ISNULL
,因为我的表太大了,是否使用ISNULL
可能会导致性能下降?
提前致谢
答案 0 :(得分:48)
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列表中的答案 3 :(得分:1)
避免在where子句中使用isNull。请参阅This article。
答案 4 :(得分:1)
是的,在SQL Server Studio 2012中存在性能问题。
当我将ISNULL
与OVER
结合使用时,问题非常明显。优化后(即将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()而没有它)并比较结果。