W wysłanym zapytaniu:
select * from <table_name>;
Nie ma czegoś takiego jak wiersze od 100 do 200, ponieważ nie określasz ORDER BY. Zamówienie nie jest gwarantowane, chyba że podasz ORDER BY z wielu interesujących powodów, ale nie o to tutaj chodzi.
Aby zilustrować twój punkt, użyjmy tabeli - skorzystam z tabeli Użytkownicy ze zrzutu zrzutu danych przepełnienia stosu i uruchommy to zapytanie:
SELECT * FROM dbo.Users ORDER BY DisplayName;
Domyślnie w polu DisplayName nie ma indeksu, więc SQL Server musi przeskanować całą tabelę, a następnie posortować ją według DisplayName. Oto plan wykonania :
To nie jest ładne - to dużo pracy, przy szacowanym koszcie około 30 000 drzew. (Możesz to zobaczyć, umieszczając kursor myszy nad operatorem wyboru w PasteThePlan.) Co się stanie, jeśli chcemy tylko wiersze 100-200? Możemy użyć tej składni w SQL Server 2012+:
SELECT * FROM dbo.Users ORDER BY DisplayName OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY;
Również plan wykonania jest dość brzydki:
SQL Server wciąż skanuje całą tabelę, aby zbudować posortowaną listę, aby uzyskać wiersze 100-200, a koszt nadal wynosi około 30 tys. Co gorsza, cała lista będzie przebudowywana za każdym razem, gdy zostanie uruchomione zapytanie (ponieważ w końcu ktoś mógł zmienić swoją nazwę wyświetlaną).
Aby przyspieszyć, możemy utworzyć indeks nieklastrowany na DisplayName, który jest kopią naszej tabeli, posortowaną według tego konkretnego pola:
CREATE INDEX IX_DisplayName ON dbo.Users(DisplayName);
Z tym indeksem plan wykonania naszego zapytania wyszukuje teraz indeks:
Kwerenda kończy się natychmiast i ma szacunkowy koszt poddrzewa zaledwie 0,66 (w przeciwieństwie do 30 tys.).
Podsumowując, jeśli uporządkujesz dane w sposób, który obsługuje często uruchamiane zapytania, to tak, SQL Server może przyjąć skróty, aby przyspieszyć twoje zapytania. Z drugiej strony, jeśli wszystko, co masz, to stosy lub indeksy klastrowe, to jesteś zepsuty.