我正在尝试使用筛选索引来针对特定方案优化查询。为简单起见,我设法用虚拟表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。