加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 是否在ISNULL中包装可空的列导致表扫描?

发布时间:2020-12-12 07:50:15 所属栏目:MsSql教程 来源:网络整理
导读:Visual Studio 2010数据库项目的代码分析规则 SR0007指出: You should explicitly indicate how to handle NULL values in comparison expressions by wrapping each column that can contain a NULL value in an ISNULL function. 但是当以下情况违反代码分
Visual Studio 2010数据库项目的代码分析规则 SR0007指出:

You should explicitly indicate how to handle NULL values in comparison expressions by wrapping each column that can contain a NULL value in an ISNULL function.

但是当以下情况违反代码分析规则SR0006时:

As part of a comparison,an expression contains a column reference … Your code could cause a table scan if it compares an expression that contains a column reference.

这是否也适用于ISNULL,还是ISNULL不会导致表扫描?

解决方法

是的,它会导致表扫描. (虽然似乎优化了,如果列实际上不可空)

SR0007规则是非常糟糕的一般建议,因为它使谓词不可缩放,意味着该列上的任何索引将无用.即使列上没有索引,它仍然可能使基数估计不准确影响计划的其他部分.

它在Microsoft.Performance类别中的分类是相当有趣的,因为它似乎是由没有了解查询性能的人写的.

它声称的理由是

If your code compares two NULL values or a NULL value with any other
value,your code will return an unknown result.

虽然表达式本身确实评估为未知,但您的代码在您明白any =,>,<等于NULL与NULL进行比较,评估为“未知”,并且WHERE子句仅返回表达式求值为true的行. 这可能意味着如果ANSI_NULLS关闭,但它们在WHERE ISNULL([c2],0)>的文档中给出的示例. 2; vs WHERE [c2]> 2;不会受到这种设置的影响.这个设置

affects a comparison only if one of the operands of the comparison is
either a variable that is NULL or a literal NULL.

执行计划显示扫描对寻求或下面

CREATE TABLE #foo
  (
     x INT NULL UNIQUE
  )

INSERT INTO #foo
SELECT ROW_NUMBER() OVER (ORDER BY @@SPID)
FROM   sys.all_columns

SELECT *
FROM   #foo
WHERE  ISNULL(x,10) = 10

SELECT *
FROM   #foo
WHERE  x = 10

SELECT *
FROM   #foo
WHERE  x = 10
        OR x IS NULL

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读