gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:17:17 25 4
gpt4 key购买 nike

代码分析规则SR0007对于 Visual Studio 2010 数据库项目指出:

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.

虽然表达式本身的计算结果为 unknown一旦您了解任何=,您的代码就会返回完全确定的结果, <> , > , <NULL 等比较评估为Unknown并且 WHERE子句仅返回表达式计算结果为 true 的行.

它们的意思可能是 ANSI_NULLS 已关闭,但他们在 WHERE ISNULL([c2],0) > 2; 的文档中给出的示例与 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

enter image description here

关于sql-server - 将可为空的列包装在 ISNULL 中是否会导致表扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7471740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com