U selecteert de top 50 rijen gerangschikt op e.uon desc
. Een index die begint met uon
zal de zoekopdracht versnellen:
create index IX_Empl_Uon on dbo.empl (uon)
Met de index kan SQL Server de bovenste N rijen van deze index scannen. N is het hoogste getal in uw paginering:voor de 3e pagina van 50 elementen is N gelijk aan 150. SQL Server voert vervolgens 50 sleutelzoekopdrachten uit om de volledige rijen uit de geclusterde index op te halen. Voor zover ik weet, is dit een schoolvoorbeeld van waar een index een groot verschil kan maken.
Niet alle query-optimizers zijn slim genoeg om op te merken dat row_number() over ... as rn
met where
rn between 1 and 50
betekent de bovenste 50 rijen. Maar SQL Server 2012 wel. Het gebruikt de index zowel voor eerste als opeenvolgende pagina's, zoals row_number() between 50 and 99
.