La seguente query utilizza un indice di ricerca su un indice sulla colonna LastModifiedTime.Index Seek vs. Clustered Index Scan: perché viene scelta la scansione?
SELECT
CONVERT(varchar, a.ReadTime, 101) as ReadDate,
a.SubID,
a.PlantID,
a.Unit as UnitID,
a.SubAssembly
FROM dbo.Accepts a WITH (NOLOCK)
WHERE a.LastModifiedTime BETWEEN '3/3/2010' And '3/4/2010'
AND a.SubAssembly = '400'
La domanda sotto, che è quasi identica alla query precedente, utilizza una scansione indice cluster, anziché l'indice sulla LastModifiedTime. Qualcuno può dirmi perché? E, cosa più importante, quello che posso fare per ottenere SQL Server per utilizzare l'indice sulla colonna LastModifiedTime, senza utilizzare un hint di indice.
Declare @LastModifiedTimeEnd dateTime
Declare @LastModifiedTimeStart dateTime
SELECT
CONVERT(varchar, a.ReadTime, 101) as ReadDate,
a.SubID,
a.PlantID,
a.Unit as UnitID,
a.SubAssembly
FROM dbo.Accepts a WITH (NOLOCK)
WHERE a.LastModifiedTime BETWEEN @LastModifiedTimeStart And @LastModifiedTimeEnd
AND a.SubAssembly = '400'
sono confusa sul motivo per cui il pianificatore di query sarebbe assumere l'indice cluster è meglio. Indipendentemente da quali siano i parametri, si sta ancora confrontando una colonna specifica che ha un indice creato per essa. Qual è il punto di tale indice se è usato solo con parametri fissi? –
@Kent: utilizzando un indice secondario per recuperare un intervallo di valori richiede unire l'indice indietro alla tabella. Quando l'intervallo è ampio, l'overhead del join supera il sovraccarico di ordinamento. – Quassnoi
Vedo - grazie. Suppongo che una sorta di presunto sniffing dei parametri sia un comportamento predefinito. Presumibilmente usando '> = @LastModifiedTimeStart AND <= LastModifiedTimeEnd' precluderebbe anche l'uso dell'indice non cluster senza specificare' OPTION (RECOMPILE) '. –