możliwym wytłumaczeniem jest tu in the commentOptymalizacja SQL Server Query - Nieoczekiwany powolność w prosty zapytania
W SQL Server 2014 Enterprise Edition (64-bit) - Staram się czytać z widoku. Standardowe zapytanie zawiera tylko taką klauzulę: ORDER BY
i OFFSET-FETCH
.
Metoda 1
SELECT
*
FROM Metadata
ORDER BY
AgeInHours ASC,
RankingPoint DESC,
PublishDate DESC
OFFSET 150000 ROWS
FETCH NEXT 40 ROWS ONLY
to jednak dość proste zapytanie wykonuje prawie 9 razy wolniej (zauważalne przy pomijaniu dużą liczbę rzędów jak 150k) niż w następnym zapytania, który zwraca się ten sam rezultat.
W tym przypadku Czytam klucz podstawowy, a następnie przy użyciu tego jako parametr WHERE...IN
funkcji
Podejście 2
SELECT
*
FROM Metadata
WHERE NewsId IN (
SELECT
NewsId
FROM Metadata
ORDER BY
AgeInHours ASC,
RankingPoint DESC,
PublishDate DESC
OFFSET 150000 ROWS
FETCH NEXT 40 ROWS ONLY
)
ORDER BY
AgeInHours ASC,
RankingPoint DESC,
PublishDate DESC
Bench oznakowanie tych dwóch pokazów ta różnica
(40 row(s) affected)
SQL Server Execution Times:
CPU time = 14748 ms, elapsed time = 3329 ms.
(40 row(s) affected)
SQL Server Execution Times:
CPU time = 3828 ms, elapsed time = 469 ms.
Mam indeksy na klucz podstawowy, PubilshDate
i ich fragmentat jon jest bardzo niski. Próbowałem również uruchomić podobne kwerendy w stosunku do tabela bazy danych, ale w każdym przypadku drugie podejście daje duże zyski wydajności. Przetestowałem to również na serwerze SQL 2012.
Czy ktoś może wyjaśnić, co się dzieje?
Schemat
Sposób 1: plan wykonania
Sposób 2: plan wykonania (lewa część)
Podejście 2: Plan realizacji (z prawej strony)
Jeśli uruchomisz pierwsze podejście i zaznaczysz tylko ** kolumnę "ID", co się stanie? Podejrzewam, że gwiazdka '*' spowalnia zapytanie, ponieważ zmusza do skanowania wszystkich kolumn. – sagi
O wiele szybciej (prawie 9 razy, powiedzmy), jak sądzę, szuka tylko indeksowanej kolumny ("Id"). Zaskakujące jest to, że w drugim zapytaniu nadal czyta się tę samą ilość danych, gdy użyłem klauzuli "WHERE-IN" - ale nie zajmuje to czasu. Co się dzieje za kulisami? – undefined
Czy można uwzględnić plany kwerend i schemat tabeli? –