假设我正在运行一个显示有趣猫图片的网站。我有一个名为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
?