筛选索引条件由优化器忽略(Filtered index condition is ignored b

2019-06-25 05:38发布

假设我运行一个网站,展示可爱的猫的照片。 我有一个表叫CatPictures与列FilenameAwesomeness ,和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

Answer 1:

不,不是现在。

看到这个连接项目 。 它是封闭,不会解决。 (或者这一项对于IS NULL的情况下具体地)

的连接物品上没有提供以下所示的解决方法。

发布者RichardB CFCU上29/09/2011上午9:15

一种解决方法是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) 


Answer 2:

有没有一种方法,以使SQL Server意识到过滤条件已经做检查DeletionDate的工作吗?

没有。

过滤索引旨在解决某些问题,不是全部。 事情演变,有一天,你可能会看到SQL Server的支持你期待过滤索引的功能,但它也有可能是你可能永远也看不到它。

有几个很好的理由,我可以看到它是如何工作的。

它提高了:

  1. 存储。 索引仅包含符合过滤条件的键
  2. 性能。 十拿九稳从上方。 少写少页=快速的检索

它不会做什么:

  1. 更改查询引擎根本

把它们放在一起,考虑到SQL Server正在重流水线,多处理器并行能力的野兽,我们用服务查询打交道时得到以下行为:

  1. 先决条件查询优化选择索引:检查筛选索引是否适用对WHERE子句。
  2. 查询优化器继续它从统计确定选择性,这取决于索引是否被覆盖等重达首页 - >书签查找VS群集/堆扫描的正常工作

针对超线程过滤的指数的条件进入查询优化“核心”我怀疑将是比在步骤1中留一个更大的工作。

就个人而言,我尊重的SQL Server开发团队,如果它是很容易的,他们可能把它变成一个不太遥远的冲刺,并完成它。 然而,那里的东西目前已经实现了它的目的是,让我很高兴。



Answer 3:

只要发现“差距的功能”,这是很可悲的是过滤索引是通过优化忽略。 我想我会尝试使用索引视图为,看看这篇文章

http://www.sqlperformance.com/2013/04/t-sql-queries/optimizer-limitations-with-filtered-indexes



文章来源: Filtered index condition is ignored by optimizer