2011-10-06 44 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

是的,我已經嘗試過,它的工作原理。 –