【问题标题】:Is there is any Performance issue while using ISNULL() in SQL Server?在 SQL Server 中使用 ISNULL() 时是否存在任何性能问题?
【发布时间】:2012-02-14 01:04:24
【问题描述】:

我在 MS SQl server 2008 中使用ISNULL,因为我的表太大,使用ISNULL 是否会对性能造成任何影响?

提前致谢

【问题讨论】:

  • 取决于很多事情,一如既往。你如何使用它,你在哪里使用它,你的查询是什么。更多细节可能会有所帮助。
  • @SergioTulentsev 我正在做一个增强项目。所以我们在 tbls 中添加了一些新的列。那将是空的。可用于开发的数据很少。生产数据库非常庞大。我无法访问它。
  • @Paddy 我的主要疑问是,如果我们在为增强功能添加的某些列中使用 ISNULL(col,0)(请在注释上方的 c),我们可以通过在 SP 或需要使用 ISNULL 来避免 NULL 值检查代码中的 NULL。什么更好?
  • 与查询的其余部分相比,在 SELECT 列表中有 ISNULL 是不可测量的。不要optimise prematurely
  • @Harie - 如果你需要加载你的 DEV 数据库,你可能想看看这样的东西:red-gate.com/products/sql-development/sql-data-generator

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


【解决方案1】:

注意是否使用带有子查询的 ISNULL 作为替换值。

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

CASE 按预期执行。

【讨论】:

    【解决方案2】:

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

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

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

    还没有准备好进一步深入研究。简单的放在这里供其他人参考。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 嘿,这个问题已经有了一个公认的答案。这是很好的信息,但作为评论会更好:)
      • 我没看懂那篇文章。它已经在看裸柱了。 Isnull(@someVar, 0) 不应该很昂贵。如果不使用索引,Isnull(someColumn, 0) 可能会很昂贵。
      【解决方案4】:

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

      【讨论】:

      • 请注意,这两个条件不会给出相同的结果。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        编辑

        在 SELECT 列表中使用 ISNULL 来抑制 NULLS 是微不足道的。主要工作将在处理行和数据中完成。额外的 ISNULL 无法测量:不要optimise prematurely

        【讨论】:

        • 根据这篇文章的另一个答案,ISNULL 函数在 SELECT 中使用时与在 WHERE 或 JOIN 子句中使用时具有显着不同的性能配置文件。我的经验证实了这一点。
        • @DavidAlpert 同意。容易误用
        【解决方案7】:

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

        我也建议你去看看这个 - What makes a SQL statement sargable?

        【讨论】:

          【解决方案8】:

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

          (Field = @x OR @x IS NULL)
          

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

          【讨论】:

          • 我的查询:- 从 tbl 中选择 oldcol,isnull(newcol,0) 'a'。所以在这里我使用的是 ISNULL。你能根据你的查询稍微解释一下吗?谢谢
          • 在您的情况下,使用 ISNULL 的效果可以忽略不计
          猜你喜欢
          • 2011-01-19
          • 2011-12-17
          • 1970-01-01
          • 2013-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多