Mam tabele Log i LogItem; Piszę zapytanie, aby pobrać dane z obu. Istnieją tysiące Logs
i każdy Log
może mieć do 125LogItems
Zapytanie jest skomplikowane, więc pomijam je (jeśli ktoś uważa, że to ważne, prawdopodobnie mogę je opublikować), ale kiedy uruchomiłem plan SSMS Estimated Query, powiedział mi, że nowy indeks nieklastrowany poprawi wydajność nawet o 100% .
Existing Index: Non-clustered
Key Colums (LogItem): ParentLogID, DateModified, Name, DatabaseModified
Query Plan Recommendation
CREATE NONCLUSTERED INDEX [LogReportIndex]
ON [dbo].[LogItem] ([ParentLogID],[DatabaseModified])
Dla zabawy stworzyłem ten nowy indeks i uruchomiłem zapytanie. Ku mojemu zdziwieniu, moje zapytanie działa teraz około 1 sekundy, zanim było ponad 10 sekund.
Zakładałem, że mój istniejący indeks obejmowałby to nowe zapytanie, więc moje pytanie brzmi: dlaczego utworzenie nowego indeksu dla jedynych kolumn użytych w moim nowym zapytaniu poprawiło wydajność? Czy powinienem mieć indeks dla każdej unikalnej kombinacji kolumn używanych w moich where
klauzulach?
Uwaga: Nie sądzę, że dzieje się tak, ponieważ SQL Server buforuje moje wyniki, uruchomiłem zapytanie około 25-30 razy, zanim utworzyłem indeks, i konsekwentnie zajęło to 10-15 sekund, po indeksie jest teraz konsekwentnie ~ 1 lub mniej.