假设我的索引定义如下:
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',它会被使用吗?
答案 0 :(得分:2)
如果索引包含查询中所需记录的超集,而非子集,则会使用该索引。
基本上,如果引擎知道或怀疑索引是否排除了结果集中可能需要的记录,它将不会使用该索引。
答案 1 :(得分:0)
另外,请注意 - 只有当where子句的日期值为硬编码时,才会使用过滤后的索引。如果在where子句中使用参数(通过参数化查询或SP),则不会使用过滤后的索引。
所以如果你有:
declare @d date = '8/1/2011'
Select * From Marker Where ReadTime > @d
在上述情况下,不会使用过滤的索引。