2010-09-19 12 views
9

¿Cuál es la solución de paginación más eficiente que usa SQL Server 2005 contra una tabla con alrededor de 5,000-10,000 filas? He visto varios por ahí pero nada que los compare.¿La mejor solución de paginación usando SQL Server 2005?

+1

posible duplicado de [ASP.NET, SQL 2005 "paginación"] (http://stackoverflow.com/questions/1058825/asp-net-sql-2005-paging) – M4N

+0

numerosas: http://stackoverflow.com/questions/tagged/pagination + sql-server –

Respuesta

22

Para una tabla de ese tamaño, utilice una Expresión de tabla común (CTE) y ROW_NUMBER; use una función pequeña para calcular los registros para traer de vuelta según las variables @PageNumber y @PageSize (o lo que sea que quiera llamar). Un simple ejemplo de uno de nuestros procedimientos almacenados:

-- calculate the record numbers that we need 

DECLARE @FirstRow INT, @LastRow INT 
SELECT @FirstRow = ((@PageNumber - 1) * @PageSize) + 1, 
     @LastRow = ((@PageNumber - 1) * @PageSize) + @PageSize 

; 
WITH CTE AS 
(
    SELECT [Fields] 
      , ROW_NUMBER() OVER (ORDER BY [Field] [ASC|DESC]) as RowNumber 
    FROM [Tables] 
    WHERE [Conditions, etc] 
) 
SELECT * 
     -- get the total records so the web layer can work out 
     -- how many pages there are 
     , (SELECT COUNT(*) FROM CTE) AS TotalRecords 
FROM CTE 
WHERE RowNumber BETWEEN @FirstRow AND @LastRow 
ORDER BY RowNumber ASC 
+0

¿Tienes que esperar a que el proceso se ejecute una vez para poder obtener el número total de páginas? – Caveatrob

+0

PD: ¡esto está funcionando bien hasta ahora! – Caveatrob

+0

Sí, la forma en que lo hacemos es usar los resultados del proceso para llenar un pequeño objeto PagingInfo que maneja el proceso de escribir los enlaces del número de página. Suponiendo que no está haciendo una cantidad loca de uniones o llamadas de función en la consulta, este bebé debería ejecutarse casi al instante, por lo que nunca ha sido un problema para nosotros. Me alegro de que funcione para ti :) –

1

Incluso esto debería ayudar ..

SELECT * FROM 
( 
    SELECT Row_Number() OVER(order by USER_ID) As RowID, 
    COUNT (USER_ID) OVER (PARTITION BY null) AS TOTAL_ROWS, 
    select name from usertbl 
) 
As RowResults WHERE 
RowID Between 0 AND 25 

No estoy seguro si es mejor que @keith versión.

Cuestiones relacionadas