W przypadku średnio złożonego zapytania, które próbuję zoptymalizować, zauważyłem, że usunięcie TOP n
klauzuli zmienia plan wykonania. Zgadłbym, że gdy zapytanie zawiera TOP n
silnik bazy danych, uruchomiłoby zapytanie ignorując TOP
klauzulę, a następnie na koniec zmniejszyłem zestaw wyników do n żądanej liczby wierszy. Graficzny plan wykonania wydaje się wskazywać, że tak jest - TOP
to „ostatni” krok. Ale wydaje się, że dzieje się więcej.
Moje pytanie brzmi: w jaki sposób (i dlaczego) klauzula TOP n wpływa na plan wykonania zapytania?
Oto uproszczona wersja tego, co dzieje się w moim przypadku:
Zapytanie pasuje do wierszy z dwóch tabel, A i B.
Bez TOP
klauzuli optymalizator szacuje, że będzie 19 tys. Wierszy z tabeli A i 46 tys. Wierszy z tabeli B. Rzeczywista liczba zwróconych wierszy wynosi 16 tys. Dla A i 13 tys. Dla B. Dopasowanie mieszania jest używane do połączenia tych dwóch zestawów wyników dla łącznie 69 wierszy (następnie stosowane jest sortowanie). To zapytanie dzieje się bardzo szybko.
Po dodaniu TOP 1001
optymalizator nie używa dopasowania mieszania; zamiast tego najpierw sortuje wyniki z tabeli A (ta sama wartość szacunkowa / rzeczywista 19k / 16k) i wykonuje zagnieżdżoną pętlę względem tabeli B. Szacowana liczba wierszy dla tabeli B wynosi teraz 1, a dziwne jest to, że TOP n
bezpośrednio wpływa na szacunkowa liczba egzekucji (szukanie indeksu) w stosunku do B - wydaje się, że zawsze wynosi 2n + 1 , lub w moim przypadku 2003. To oszacowanie zmienia się odpowiednio, jeśli zmienię TOP n
. Oczywiście, ponieważ jest to łączenie zagnieżdżone, faktyczna liczba wykonań wynosi 16k (liczba wierszy z tabeli A), co spowalnia zapytanie.
Rzeczywisty scenariusz jest nieco bardziej złożony, ale odzwierciedla on podstawowy pomysł / zachowanie. Obie tabele są przeszukiwane za pomocą wyszukiwania indeksowego. To jest wersja SQL Server 2008 R2 Enterprise.
FAST num_rows
wskazówka dotycząca zapytania.
ORDER BY
klauzulę. DodanieTOP
zmian tam, gdzie występuje taki plan, ale jestem bardziej zaniepokojony tym, jak wpływa to na liczbę wykonań wyszukiwania indeksu względem tabeli B ... (oczywiście te dwie mogą być powiązane - nie wiem)