Entonces, tengo una función que devuelve una cantidad de registros para los que quiero implementar la paginación en mi sitio web. Se me sugirió que use Offset / Fetch Next en SQL Server 2012 para lograr esto. En nuestro sitio web, tenemos un área que enumera el número total de registros y en qué página se encuentra en ese momento.
Antes, obtenía todo el conjunto de registros y pude construir la paginación en eso programáticamente. Pero usando la forma SQL con FETCH NEXT X ROWS ONLY, solo me devuelven X filas, por lo que no sé cuál es mi conjunto de registros total y cómo calcular mis páginas mínimas y máximas. La única forma en que puedo decir que hago esto es llamando a la función dos veces y haciendo un recuento de filas en la primera, luego ejecutando la segunda con FETCH NEXT. ¿Hay alguna manera mejor que no me permita ejecutar la consulta dos veces? Estoy intentando acelerar el rendimiento, no ralentizarlo.
fuente
Encontré algunos problemas de rendimiento con el método COUNT ( ) OVER (). (No estoy seguro de si fue el servidor, ya que tardó 40 segundos en devolver 10 registros y luego no tuve ningún problema). Esta técnica funcionó en todas las condiciones sin tener que usar COUNT ( ) OVER () y logra el la misma cosa:
DECLARE @PageSize INT = 10, @PageNum INT = 1; WITH TempResult AS( SELECT ID, Name FROM Table ), TempCount AS ( SELECT COUNT(*) AS MaxRows FROM TempResult ) SELECT * FROM TempResult, TempCount ORDER BY TempResult.Name OFFSET (@PageNum-1)*@PageSize ROWS FETCH NEXT @PageSize ROWS ONLY
fuente
Basado en la respuesta de James Moberg :
Esta es una alternativa de uso
Row_Number()
, si no tiene SQL Server 2012 y no puede usar OFFSETDECLARE @PageNumEnd INT = 10, @PageNum INT = 1; WITH TempResult AS( SELECT ID, NAME FROM Tabla ), TempCount AS ( SELECT COUNT(*) AS MaxRows FROM TempResult ) select * from ( SELECT ROW_NUMBER() OVER ( ORDER BY PolizaId DESC) AS 'NumeroRenglon', MaxRows, ID, Name FROM TempResult, TempCount )resultados WHERE NumeroRenglon >= @PageNum AND NumeroRenglon <= @PageNumEnd ORDER BY NumeroRenglon
fuente