2011-10-06 1 views
1

Dire que je suis un index défini comme suit:SQL Server 2008 - Filtrée Index

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

Dans quelles circonstances le générateur de plan de SQL Server sélectionnez cet index? Par exemple, disons que j'ai la requête suivante:

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

Je suppose que l'index ne serait pas utilisé dans ce cas? Mais si je changeais la clause Where en '01/08/2011', elle serait utilisée?

Répondre

2

L'indice sera utilisé quand il comprend un surensemble des enregistrements nécessaires dans la requête, pas un sous-ensemble .

Fondamentalement, si le moteur SAIT ou SUSPECTE que l'index exclut les enregistrements qui seront potentiellement nécessaires dans le jeu de résultats, il n'utilisera pas cet index.

0

également, juste un mot d'avertissement - votre index filtré ne sera utilisé que si la clause where a la valeur de date codée en dur. Si vous utilisez un paramètre (soit une requête paramétrée, soit un SP) dans votre clause where, l'index filtré ne sera pas utilisé.

Donc, si vous avez:

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

Dans le cas ci-dessus l'index filtré ne sera pas utilisé.

+0

Non correct. Ajoutez OPTION (RECOMPILE) après la clause Where et il sera utilisé. –

+0

Etes-vous vraiment sûr et avez-vous essayé cela? J'ai essayé ceci avec divers index filtrés et cela n'a jamais fonctionné. –

+0

Oui j'ai essayé ceci, et cela fonctionne. –