假设我运行一个网站,展示可爱的猫的照片。 我有一个表叫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
?
不,不是现在。
看到这个连接项目 。 它是封闭,不会解决。 (或者这一项对于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)
有没有一种方法,以使SQL Server意识到过滤条件已经做检查DeletionDate的工作吗?
没有。
过滤索引旨在解决某些问题,不是全部。 事情演变,有一天,你可能会看到SQL Server的支持你期待过滤索引的功能,但它也有可能是你可能永远也看不到它。
有几个很好的理由,我可以看到它是如何工作的。
它提高了:
- 存储。 索引仅包含符合过滤条件的键
- 性能。 十拿九稳从上方。 少写少页=快速的检索
它不会做什么:
- 更改查询引擎根本
把它们放在一起,考虑到SQL Server正在重流水线,多处理器并行能力的野兽,我们用服务查询打交道时得到以下行为:
- 先决条件查询优化选择索引:检查筛选索引是否适用对WHERE子句。
- 查询优化器继续它从统计确定选择性,这取决于索引是否被覆盖等重达首页 - >书签查找VS群集/堆扫描的正常工作
针对超线程过滤的指数的条件进入查询优化“核心”我怀疑将是比在步骤1中留一个更大的工作。
就个人而言,我尊重的SQL Server开发团队,如果它是很容易的,他们可能把它变成一个不太遥远的冲刺,并完成它。 然而,那里的东西目前已经实现了它的目的是,让我很高兴。
只要发现“差距的功能”,这是很可悲的是过滤索引是通过优化忽略。 我想我会尝试使用索引视图为,看看这篇文章
http://www.sqlperformance.com/2013/04/t-sql-queries/optimizer-limitations-with-filtered-indexes