2011-10-06 130 views
1

说,我有一个索引定义如下:SQL Server 2008中 - 过滤索引

CREATE NONCLUSTERED INDEX [IX_Marker] ON [dbo].[Marker] 
(
    [Run] ASC, 
    [EquipmentID] ASC, 
    [ReadTime] DESC 
) 
INCLUDE ([Sequence]) 
WHERE ([ReadTime]>'07/01/2011') 

在什么情况下会在SQL Server计划生成器选择该指数?例如,假设我有以下查询:

Select * From Marker Where ReadTime > '3/1/2011' 

我假设索引不会在这种情况下使用?但是如果我将Where子句更改为'8/1/2011',它会被使用吗?

回答

2

该索引将用于它包含查询中所需记录的超集,而不是子集

基本上,如果引擎知道或怀疑索引排除了结果集中可能需要的记录,它将不会使用该索引。

0

此外,只需谨慎 - 只有当where子句具有硬编码的日期值时,才会使用您的筛选索引。如果您在where子句中使用参数(参数化查询或SP),则不会使用已过滤的索引。

所以,如果您有:

declare @d date = '8/1/2011' 
Select * From Marker Where ReadTime > @d 

在上述情况下过滤索引将不会被使用。

+0

不正确。在Where子句后面添加OPTION(RECOMPILE),它将被使用。 –

+0

你真的确定你试过吗?我尝试过使用各种过滤索引,它从来没有工作。 –

+0

是的,我已经尝试过,它的工作原理。 –