Tom*_*ter 11 t-sql sql-server datadude sql-server-2008 sql-server-data-tools
Visual Studio 2010数据库项目的代码分析规则SR0007指出:
您应该通过在ISNULL函数中包装每个可以包含NULL值的列来明确指出如何处理比较表达式中的NULL值.
作为比较的一部分,表达式包含列引用...如果它比较包含列引用的表达式,则代码可能会导致表扫描.
这是否也适用于ISNULL,或者ISNULL是否永远不会导致表扫描?
Mar*_*ith 18
是的,它导致表扫描.(虽然如果列实际上不可为空,似乎会得到优化)
该 SR0007规则是毯子建议极差,因为它呈现的断言unsargable和手段在列的任何索引将是无用的.即使列上没有索引,它仍可能使基数估计值不准确,影响计划的其他部分.
它在Microsoft.Performance类别中的分类非常有趣,因为它似乎是由不了解查询性能的人编写的.
它声称理由是
如果您的代码将两个NULL值或NULL值与任何其他值进行比较,则代码将返回未知结果.
虽然表达本身并评估对unknown您的代码返回一个完全确定的结果,一旦你明白,任何=,<>,>,<与等比较NULL评估为Unknown与该WHERE条款只返回了表达式的计算结果为行true.
它们可能意味着是否ANSI_NULLS关闭但是他们在WHERE ISNULL([c2],0) > 2;vs 的文档中给出的示例WHERE [c2] > 2;无论如何都不会受到此设置的影响.这个设置
仅当比较的一个操作数是NULL变量或文字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
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
2029 次 |
| 最近记录: |