solo registros paginacion mostrar and 11g performance paging sql-server-2012

performance - registros - Obtención del número total de filas desde OFFSET/FETCH NEXT



paginacion oracle 11g (3)

Basado en la respuesta de James Moberg :

Esta es una alternativa utilizando Row_Number() , si no tiene el servidor SQL 2012 y no puede usar OFFSET

DECLARE @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

Entonces, tengo una función que devuelve una serie de registros para los que quiero implementar la paginación en mi sitio web. Se me sugirió que utilizara el Desfase / Recuperar Siguiente en SQL Server 2012 para lograr esto. En nuestro sitio web, tenemos un área que enumera el número total de registros y la página en la que se encuentra en ese momento.

Antes, obtenía el conjunto completo de registros y podía crear la paginación en ese programa. Pero al utilizar el método SQL con FETCH NEXT X ROWS SOLAMENTE, solo me devuelven X filas, por lo que no sé cuál es mi conjunto total de registros y cómo calcular mis páginas mín. La única manera que puedo decir de hacer esto es llamar a la función dos veces y hacer un conteo de filas en la primera, y luego ejecutar la segunda con FETCH NEXT. ¿Hay una mejor manera de no tener que ejecutar la consulta dos veces? Estoy tratando de acelerar el rendimiento, no ralentizarlo.


Encontré algunos problemas de rendimiento utilizando 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 cumple los 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


Puedes usar COUNT(*) OVER() ... aquí hay un ejemplo rápido usando sys.all_objects :

DECLARE @PageSize INT = 10, @PageNum INT = 1; SELECT name, object_id, overall_count = COUNT(*) OVER() FROM sys.all_objects ORDER BY name OFFSET (@PageNum-1)*@PageSize ROWS FETCH NEXT @PageSize ROWS ONLY;