SQL Server 2008 - 过滤的索引

时间:2011-10-06 14:00:58

标签: 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 :(得分:2)

如果索引包含查询中所需记录的超集,而非子集,则会使用该索引。

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

答案 1 :(得分:0)

另外,请注意 - 只有当where子句的日期值为硬编码时,才会使用过滤后的索引。如果在where子句中使用参数(通过参数化查询或SP),则不会使用过滤后的索引。

所以如果你有:

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

在上述情况下,不会使用过滤的索引。