Quelle est la meilleure façon de paginer les résultats dans SQL Server
Obtenir le nombre total de résultats et paginer sont deux opérations différentes. Pour les besoins de cet exemple, supposons que la requête que vous traitez est
SELECT * FROM Orders WHERE OrderDate >= '1980-01-01' ORDER BY OrderDate
Dans ce cas, vous détermineriez le nombre total de résultats en utilisant :
SELECT COUNT(*) FROM Orders WHERE OrderDate >= '1980-01-01'
…ce qui peut sembler inefficace, mais est en réalité assez performant, à condition que tous les index, etc., soient correctement configurés.
Ensuite, pour obtenir les résultats réels de manière paginée, la requête suivante serait la plus efficace :
SELECT *
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum, *
FROM Orders
WHERE OrderDate >= '1980-01-01'
) AS RowConstrainedResult
WHERE RowNum >= 1
AND RowNum < 20
ORDER BY RowNum
Cela renverra les lignes 1 à 19 de la requête originale. L’avantage ici, notamment pour les applications web, est que vous n’avez pas besoin de conserver d’état, à l’exception des numéros de lignes à renvoyer.