【发布时间】:2012-06-05 12:20:08
【问题描述】:
假设我正在运行一个显示有趣猫图片的网站。我有一个名为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 的工作?
【问题讨论】:
-
表中有多少数据。有时,对于少量数据,SQL 会进行表扫描,因为它更有效。这与运营效率有关。 sql 保留的统计信息可能会强制进行表扫描。
-
你的表有多少行? SQL Server 有时更喜欢对选择性较低的小表或索引进行表扫描。
-
@Namphibian 我在空表和 500 万行的表中看到了同样的情况。
标签: sql-server-2008 indexing filtered-index