假设我正在运行一个显示有趣猫图片的网站。我有一个名为CatPictures、 和 列的表Filename,Awesomeness以及DeletionDate以下索引:
create nonclustered index CatsByAwesomeness
on CatPictures (Awesomeness)
include (Filename)
where DeletionDate is null
我的主要查询是这样的:
select Filename from CatPictures where DeletionDate is null and Awesomeness > 10
我作为一个人,知道上面的索引就是SQL Server所需要的,因为索引过滤条件已经保证了DeletionDate is null部分。
然而,SQL Server 不知道这一点;我的查询的执行计划不会使用我的索引:

即使添加索引提示,它仍然会DeletionDate通过查看实际表数据来显式检查:

(此外还抱怨缺少包含 的索引DeletionDate)。
我当然可以
include (Filename, DeletionDate)
相反,它将起作用:

但是包含该列似乎是一种浪费,因为这只会占用空间而没有添加任何新信息。
有没有办法让 SQL Server 知道过滤条件已经在做检查工作DeletionDate?