使用IS NULL时,SQL Server 2014中筛选索引上的奇怪聚簇密钥查找

时间:2015-12-25 09:56:49

标签: sql sql-server sql-server-2014

我正在尝试使用筛选索引来针对特定方案优化查询。为简单起见,我设法用虚拟表Test复制我的问题。这是我的设置:

CREATE TABLE _Test
(
    Id INT NOT NULL,
    Finished BIT NULL,
    Data INT NOT NULL,
    CONSTRAINT PK_Test PRIMARY KEY CLUSTERED ( Id )
);


CREATE INDEX IX_Test_NotFinished ON _Test ( Data ) WHERE ( Finished IS NULL );

使用它作为源表,下一个查询会产生一些非常奇怪的执行计划:

SELECT Data FROM _Test WITH ( INDEX( IX_Test_NotFinished ) ) WHERE Finished IS NULL;

我没有看到只有非聚集索引扫描,而是看到了Finished字段的键查找。在索引中包含字段(例如INCLUDE( Finished ))会消除键查找,但首先不需要它。

注意:如果已完成的字段不可为空并且过滤器表达式为已完成= 0 ,则不会发生键查找,但由于我的示例是我手头的真实数据库结构的简化,我需要过滤索引使用IS NULL。

0 个答案:

没有答案