Saltar al contenido

¿Cuál es la mejor manera de paginar resultados en SQL Server?

Solución:

Finalmente, Microsoft SQL Server 2012 fue lanzado, realmente me gusta su simplicidad para una paginación, no tiene que usar consultas complejas como las que se responden aquí.

Para obtener las siguientes 10 filas, simplemente ejecute esta consulta:

SELECT * FROM TableName ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql#using-offset-and-fetch-to-limit-the-rows- regresó

Puntos clave a considerar al usarlo:

  • ORDER BY es obligatorio de usar OFFSET ... FETCH cláusula.
  • OFFSET la cláusula es obligatoria con FETCH. No se puede utilizar ORDER BY ...
    FETCH
    .
  • TOP no se puede combinar con OFFSET y FETCH en la misma expresión de consulta.

Obtener el número total de resultados y paginar son dos operaciones diferentes. Por el bien de este ejemplo, supongamos que la consulta con la que está tratando es

SELECT * FROM Orders WHERE OrderDate >= '1980-01-01' ORDER BY OrderDate

En este caso, determinaría el número total de resultados usando:

SELECT COUNT(*) FROM Orders WHERE OrderDate >= '1980-01-01'

… que puede parecer ineficiente, pero en realidad es bastante eficaz, asumiendo que todos los índices, etc.están configurados correctamente.

A continuación, para obtener los resultados reales de forma paginada, la siguiente consulta sería la más eficaz:

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

Esto devolverá las filas 1-19 de la consulta original. Lo bueno aquí, especialmente para las aplicaciones web, es que no tiene que mantener ningún estado, excepto los números de fila que se devolverán.

Increíblemente, ninguna otra respuesta ha mencionado la lo más rápido forma de hacer la paginación en todas las versiones de SQL Server. Las compensaciones pueden ser terriblemente lentas para un gran número de páginas, como se compara aquí. Existe una forma completamente diferente y mucho más rápida de realizar la paginación en SQL. Esto a menudo se denomina “método de búsqueda” o “paginación de conjuntos de claves”, como se describe en esta publicación de blog aquí.

SELECT TOP 10 first_name, last_name, score, COUNT(*) OVER()
FROM players
WHERE (score < @previousScore)
   OR (score = @previousScore AND player_id < @previousPlayerId)
ORDER BY score DESC, player_id DESC

El “predicado de búsqueda”

los @previousScore y @previousPlayerId Los valores son los valores respectivos del último registro de la página anterior. Esto le permite buscar la página “siguiente”. Si el ORDER BY la dirección es ASC, simplemente usa > en lugar de.

Con el método anterior, no puede saltar inmediatamente a la página 4 sin haber obtenido primero los 40 registros anteriores. Pero a menudo, no querrás saltar tan lejos de todos modos. En cambio, obtiene una consulta mucho más rápida que podría obtener datos en un tiempo constante, dependiendo de su indexación. Además, sus páginas permanecen “estables”, sin importar si los datos subyacentes cambian (por ejemplo, en la página 1, mientras está en la página 4).

Esta es la mejor manera de implementar la paginación cuando se carga más datos en aplicaciones web, por ejemplo.

Tenga en cuenta que el “método de búsqueda” también se denomina paginación de conjuntos de claves.

Total de registros antes de la paginación

los COUNT(*) OVER() La función de ventana le ayudará a contar el número total de registros “antes de la paginación”. Si está utilizando SQL Server 2000, tendrá que recurrir a dos consultas para el COUNT(*).

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *