我需要向 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
在上面的执行计划中,唯一访问的索引是 UQ_X
,它甚至不包含使此类运行时评估成为可能的 ID
列。
相比之下,如果ID
可为空(并用唯一约束而不是主键替换,因为 PK 不允许 NULL),那么当然需要在运行时进行检查,并且因此该计划需要检索该列,并且可能类似于以下内容之一。
使用插入扫描的谓词扫描整个表
尝试使用较窄的索引需要查找来检索列并评估谓词
关于SQL Server - 忽略始终为真的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31770631/