W przypadku średnio złożonego zapytania, które próbuję zoptymalizować, zauważyłem, że usunięcie TOP nklauzuli zmienia plan wykonania. Zgadłbym, że gdy zapytanie zawiera TOP nsilnik bazy danych, uruchomiłoby zapytanie ignorując TOPklauzulę, a następnie na koniec zmniejszyłem zestaw wyników do n żądanej liczby wierszy. Graficzny plan wykonania wydaje się wskazywać, że tak jest - TOPto „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 TOPklauzuli 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 1001optymalizator 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 nbezpoś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_rowswskazówka dotycząca zapytania.
ORDER BYklauzulę. DodanieTOPzmian 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)