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

时间:2015-08-02 09:48:23

标签: sql sql-server sql-server-2012

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

ID是主键(因此NOT NULL

我会执行一个选择:

SELECT *
FROM   Table 
WHERE  ID IS NOT NULL 

是否会忽略或检查每一行的这种情况?

3 个答案:

答案 0 :(得分:4)

SQL Server可以在编译时确定此条件始终为true,并且无需在运行时进行检查。

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

答案 1 :(得分:0)

执行以下查询时:

SELECT * FROM Table WHERE ID IS NOT NULL;

在ID被定义为主键的情况下,它将显示表中的所有行。从显示的角度来看,这与SELECT * FROM Table;类似。但是,条件不会被忽略。(即将检查where子句)

答案 2 :(得分:0)

SELECT        *
FROM          TableName
WHERE        (ID IS NOT NULL)

将显示ID不为空的所有数据。 如果ID是表格中的主键,则ID不会为空! 因此,您将从表中获取所有数据