Wybierasz 50 pierwszych wierszy uporządkowanych według e.uon desc
. Indeks zaczynający się od uon
przyspieszy zapytanie:
create index IX_Empl_Uon on dbo.empl (uon)
Indeks umożliwi programowi SQL Server przeskanowanie N górnych wierszy tego indeksu. N to najwyższa liczba w paginacji:dla trzeciej strony zawierającej 50 elementów N równa się 150. Następnie SQL Server przeprowadza 50 wyszukiwań kluczy w celu pobrania pełnych wierszy z indeksu klastrowego. O ile mi wiadomo, jest to podręcznikowy przykład tego, gdzie indeks może mieć duże znaczenie.
Nie wszystkie optymalizatory zapytań będą wystarczająco inteligentne, aby zauważyć, że row_number() over ... as rn
z where
rn between 1 and 50
oznacza górne 50 wierszy. Ale SQL Server 2012 to robi. Używa indeksu zarówno dla pierwszej, jak i kolejnych stron, np. row_number() between 50 and 99
.