SQL Server - 忽略始终为真的条件

标签 sql sql-server sql-server-2012

我需要向 WHERE 子句添加一个条件,该条件始终为真,但它必须引用其中一列,例如:

ID 是主键(因此 NOT NULL)

我将执行一个选择:

SELECT *
FROM   Table 
WHERE  ID IS NOT NULL 

是否会忽略或检查每一行的此条件?

最佳答案

SQL Server 可以在编译时确定此条件始终为真,从而避免在运行时进行检查。

CREATE TABLE #T
(
ID INT CONSTRAINT PK_ID PRIMARY KEY NONCLUSTERED,
X INT CONSTRAINT UQ_X UNIQUE
)

SELECT X 
FROM #T 
WHERE ID IS NOT NULL;    

DROP TABLE #T

enter image description here

在上面的执行计划中,唯一访问的索引是 UQ_X,它甚至不包含使此类运行时评估成为可能的 ID 列。

相比之下,如果ID可为空(并用唯一约束而不是主键替换,因为 PK 不允许 NULL),那么当然需要在运行时进行检查,并且因此该计划需要检索该列,并且可能类似于以下内容之一。

使用插入扫描的谓词扫描整个表

enter image description here

尝试使用较窄的索引需要查找来检索列并评估谓词

enter image description here

关于SQL Server - 忽略始终为真的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31770631/

相关文章:

java - 如何在 jOOQ 中写入 "like ' somevalue%'?

python - 从数据库中提取数据然后将其传递给 qtreeview

python - Json 字段搜索与 django 意外行为

sql-server - 如何在T-SQL中进行Fold?

.Net Core 2 Sql Server 连接

sql - NOLOCK 和 UNCOMMITTED 之间有什么区别

sql - 将地址值拆分为单独的列

SQL 连接排序和限制结果

sql-server - ms sql - 为什么 GO 影响我的选择(自由文本搜索)

sql - 在价格发生变化时查找每个项目的最新生效日期 - SQL Server 2014