优化程序将忽略筛选的索引条件

bal*_*pha 20 indexing sql-server-2008 filtered-index

假设我正在运行一个显示有趣猫图片的网站.我有一个名为表CatPictures与列Filename,Awesomeness以及DeletionDate和以下指标:

create nonclustered index CatsByAwesomeness
on CatPictures (Awesomeness) 
include (Filename)
where DeletionDate is null
Run Code Online (Sandbox Code Playgroud)

我的主要问题是:

select Filename from CatPictures where DeletionDate is null and Awesomeness > 10
Run Code Online (Sandbox Code Playgroud)

作为一个人,我知道上面的索引是SQL Server所需要的,因为索引过滤条件已经确保了该DeletionDate is null部分.

但是SQL Server不知道这个; 我的查询的执行计划将不使用我的索引:

查询计划,进行表扫描

即使添加索引提示,它仍将DeletionDate通过查看实际的表数据进行显式检查:

查询计划使用索引,但仍然执行书签查找

(并且还抱怨缺少的索引DeletionDate).

我当然可以

include (Filename, DeletionDate)
Run Code Online (Sandbox Code Playgroud)

相反,它会工作:

包含DeletionDate的索引的查询计划;  使用此索引

但是包含该列似乎是浪费,因为这只会占用空间而不添加任何新信息.

有没有办法让SQL Server意识到过滤条件已经在检查工作DeletionDate

Mar*_*ith 18

不,不是.

请参阅此连接项.它是关闭的,因为无法修复.(或者这一项IS NULL情况下,具体地)

连接项确实提供了如下所示的解决方法.

发布者RichardB CFCU于29/09/2011于9:15 AM发表

解决方法是对INCLUDE要过滤的列进行处理.

例:

CREATE NONCLUSTERED INDEX [idx_FilteredKey1] ON [dbo].[TABLE] 
(
    [TABLE_ID] ASC,
    [TABLE_ID2] ASC
)
INCLUDE ( [REMOVAL_TIMESTAMP]) --explicitly include the column here
WHERE ([REMOVAL_TIMESTAMP] IS NULL)
Run Code Online (Sandbox Code Playgroud)

  • 而这一个,它不是"错误",而是"功能上的差距".什么时候SQL Server团队成为一群政治家?http://connect.microsoft.com/SQLServer/feedback/details/454744/filtered-index-not-used-and-key-lookup-with-no-output (4认同)