Wiem, że jeśli chodzi o użycie indeksu lub skanowania tabeli, SQL Server używa statystyk, aby zobaczyć, który jest lepszy.
Mam stół z 20 milionami wierszy. Mam indeks na (SnapshotKey, Measure) i to zapytanie:
select Measure, SnapshotKey, MeasureBand
from t1
where Measure = 'FinanceFICOScore'
group by Measure, SnapshotKey, MeasureBand
Kwerenda zwraca 500 000 wierszy. Tak więc zapytanie wybiera tylko 2,5% wierszy tabeli.
Pytanie brzmi, dlaczego SQL Server nie używa indeksu nieklastrowanego, który mam, i zamiast tego używa skanowania tabeli?
Statystyki są aktualizowane.
Warto wspomnieć, że wydajność zapytania jest jednak dobra.
Skanowanie tabeli
Wymuszony indeks
Struktura tabeli / indeksu
CREATE TABLE [t1](
[SnapshotKey] [int] NOT NULL,
[SnapshotDt] [date] NOT NULL,
[Measure] [nvarchar](30) NOT NULL,
[MeasureBand] [nvarchar](30) NOT NULL,
-- and many more fields
) ON [PRIMARY]
Brak PK na stole, ponieważ jest to hurtownia danych.
CREATE NONCLUSTERED INDEX [nci_SnapshotKeyMeasure] ON [t1]
(
[SnapshotKey] ASC,
[Measure] ASC
)