La technique row_number() devrait être rapide. J'ai vu de bons résultats pour 100 000 lignes.
Utilisez-vous row_number() similaire à ce qui suit :
SELECT column_list
FROM
(SELECT column_list
ROW_NUMBER() OVER(ORDER BY OrderByColumnName) as RowNum
FROM MyTable m
) as DerivedTableName
WHERE RowNum BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1
...et avez-vous un index de couverture pour la colonne_liste et/ou un index sur la colonne 'OrderByColumnName' ?