Estoy trabajando en devolver un conjunto de registros de SQL Server 2008 para hacer algunas paginación. Solo estoy devolviendo 15 registros a la vez, pero necesito tener el número total de coincidencias junto con el subconjunto de registros. He usado dos consultas diferentes con resultados mixtos, dependiendo de en qué parte del grupo más grande necesito extraer el subconjunto. He aquí una muestra:Obtener un subconjunto de registros junto con el recuento total de registros
SET NOCOUNT ON;
WITH tempTable AS (
SELECT
FirstName
, LastName
, ROW_NUMBER() OVER(ORDER BY FirstName ASC) AS RowNumber
FROM People
WHERE
Active = 1
)
SELECT
tempTable.*
, (SELECT Max(RowNumber) FROM tempTable) AS Records
FROM tempTable
WHERE
RowNumber >= 1
AND RowNumber <= 15
ORDER BY
FirstName
Esta consulta funciona realmente rápido cuando estoy devolución de artículos en el extremo inferior de partidos, como registros de 1 a 15. Sin embargo, cuando empiece a devolver los registros de 1000 a 1015, el procesamiento pasará de menos de un segundo a más de 15 segundos.
Así que cambió la consulta a la siguiente en su lugar:
SET NOCOUNT ON;
WITH tempTable AS (
SELECT * FROM (
SELECT
FirstName
, LastName
, ROW_NUMBER() OVER(ORDER BY FirstName ASC) AS RowNumber
, COUNT(*) OVER(PARTITION BY NULL) AS Records
FROM People
WHERE
Active = 1
) derived
WHERE RowNumber >= 1 AND RowNumber <= 15
)
SELECT
tempTable.*
FROM tempTable
ORDER BY
FirstName
Esa consulta se ejecuta el número de altos rendimientos en 2-3 segundos, sino que también ejecuta las consultas de números bajos en 2-3 segundos también. Debido a que realiza el recuento de cada una de las más de 70,000 filas, hace que cada solicitud de tome más tiempo en lugar de solo los números de fila grandes.
Así que tengo que averiguar cómo obtener un buen recuento de filas, así como solo devolver un subconjunto de elementos en cualquier punto del conjunto de resultados sin sufrir una penalización tan grande. Podría manejar una penalización de 2-3 segundos para los números altos de la fila, pero 15 es demasiado, y no estoy dispuesto a sufrir cargas lentas en las primeras páginas que ve una persona.
NOTA: Sé que no necesito el CTE en el segundo ejemplo, pero esto es solo un ejemplo simple. En producción, estoy haciendo más uniones en la tabla de temptables una vez que la haya filtrado a las 15 filas que necesito.
Véase también [esto] (http://www.sqlservercentral.com/articles/paging/70120 /). –