Wybieram niektóre wiersze z funkcji wycenione w tabeli, ale znalazłem niewytłumaczalną ogromną różnicę wydajności poprzez umieszczenie SELECT TOP w zapytaniu.SQL ogromna różnica wydajności przy użyciu SELECT TOP x, nawet gdy x jest znacznie wyższa niż wybrane wiersze
SELECT col1, col2, col3 etc
FROM dbo.some_table_function
WHERE col1 = @parameter
--ORDER BY col1
trwa do 5 lub 6 minut do zakończenia.
Jednakże
SELECT TOP 6000 col1, col2, col3 etc
FROM dbo.some_table_function
WHERE col1 = @parameter
--ORDER BY col1
zakończona w około 4 lub 5 sekund.
Nie zdziwiłoby mnie to, gdyby zwrócony zestaw danych był ogromny, , ale konkretne zapytanie dotyczyło ~ 5000 wierszy z 200 000.
W obu przypadkach cała tabela jest przetwarzana, ponieważ SQL Server kontynuuje wyszukiwanie 6000 wierszy, do których nigdy nie dotrze. Skąd ta ogromna różnica? Czy ma to jakiś związek ze sposobem, w jaki SQL Server przydziela przestrzeń w oczekiwaniu na rozmiar zestawu wyników (TOP 6000, co daje mu niskie wymagania, które łatwiej jest przypisać w pamięci)? Czy ktoś jeszcze był świadkiem czegoś takiego?
Dzięki
Czy obejrzałeś plany zapytań? Czy istnieje różnica? –
Ciekawe, co się stanie z wydajnością, jeśli powiesz WYBIERZ 100 PERCENTÓW? –
Zgaduję, że masz jakieś statystyki, które wyrzucają optymalizator zapytania z keltera. Optymalizator może na przykład zdecydować się na użycie skanowania tabeli zamiast szukania indeksu, jeśli uważa, że w tabeli jest bardzo mało wierszy. Dlaczego nie ma to wpływu na zapytanie TOP, którego nie znam, ale sprawdzam plany wykonania. Pokazują ci to, co robi serwer, a to wyjaśnia, dlaczego jest wolny. Wyświetli ona również szacunkową i faktyczną liczbę wierszy. Jeśli niektóre szacunki są zbyt daleko, zaktualizuj statystyki i spróbuj ponownie. :) –