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;