不可空ISNULL()上的TSQL查询优化器视图

时间:2016-06-15 16:02:26

标签: sql-server tsql query-optimization

作为一些动态SQL(ick)的一部分,我已经实现了最后的“排序”#NULL;此处描述的解决方案:Sorting null-data last in database query

ORDER BY CASE column WHEN NULL THEN 1 ELSE 0 END, column

我的问题是:在应用了ISNULL()的非可空列上,查询优化器会在意识到它永远不会应用时将其删除吗?

1 个答案:

答案 0 :(得分:0)

当您的问题不在您的代码中时,为什么您的问题会提到ISNULL函数,这一点尚不清楚。

ORDER BY CASE column WHEN NULL THEN 1 ELSE 0 END, column

首先,这段代码不起作用,它等同于CASE WHEN column = NULL,而不是你需要的。

需要

ORDER BY CASE WHEN column IS NULL THEN 1 ELSE 0 END, column

优化问题很容易测试。

CREATE TABLE #T
  (
     X INT NOT NULL PRIMARY KEY
  )

SELECT *
FROM   #T
ORDER BY X

SELECT *
FROM   #T
ORDER  BY CASE WHEN X IS NULL THEN 1 ELSE 0 END, X 

DROP TABLE #T

该计划在第二个计划中显示了一个排序操作,表明它没有按照您的希望进行优化,并且模式的效率低于ORDER BY X

enter image description here