Quiero implementar la paginación tabla usando este método:¿Hay algún problema de rendimiento con Row_Number para implementar la paginación de tabla en Sql Server 2008?
SET @PageNum = 2;
SET @PageSize = 10;
WITH OrdersRN AS
(
SELECT ROW_NUMBER() OVER(ORDER BY OrderDate, OrderID) AS RowNum
,*
FROM dbo.Orders
)
SELECT *
FROM OrdersRN
WHERE RowNum BETWEEN (@PageNum - 1) * @PageSize + 1
AND @PageNum * @PageSize
ORDER BY OrderDate ,OrderID;
¿Hay algo que deba tener en cuenta? La tabla tiene millones de registros.
Thx.
EDIT: Después de usar sugerido MAXROWS
método durante algún tiempo (que funciona muy muy rápido) que tenía que volver a ROW_NUMBER
método debido a su mayor flexibilidad. También estoy muy contento con su velocidad hasta el momento (estoy trabajando con View con más de 1 millón de registros con 10 columnas). Para utilizar cualquier tipo de consulta que utilizo siguiente modificación:
PROCEDURE [dbo].[PageSelect]
(
@Sql nvarchar(512),
@OrderBy nvarchar(128) = 'Id',
@PageNum int = 1,
@PageSize int = 0
)
AS
BEGIN
SET NOCOUNT ON
Declare @tsql as nvarchar(1024)
Declare @i int, @j int
if (@PageSize <= 0) OR (@PageSize > 10000)
SET @PageSize = 10000 -- never return more then 10K records
SET @i = (@PageNum - 1) * @PageSize + 1
SET @j = @PageNum * @PageSize
SET @tsql =
'WITH MyTableOrViewRN AS
(
SELECT ROW_NUMBER() OVER(ORDER BY ' + @OrderBy + ') AS RowNum
,*
FROM MyTableOrView
WHERE ' + @Sql + '
)
SELECT *
FROM MyTableOrViewRN
WHERE RowNum BETWEEN ' + CAST(@i as varchar) + ' AND ' + cast(@j as varchar)
exec(@tsql)
END
Si se utiliza este procedimiento, asegúrese de u evitarse la inyección de SQL.
Duplicado exacto: http://stackoverflow.com/questions/1897436/row-number-over-not-fast-enough-with-large-result-set-any-good-solution –
Pony, no soy muy contento con esa respuesta, sobre todo porque ni siquiera menciona Row_Number() ..... La pregunta es, una vez más: Estoy usando Row_Number().¿Qué me puedes decir sobre su rendimiento en comparación con otros métodos (por lo tanto, no me ofrezcas otro método) – majkinetor
BTW, Pony Encuentro comentarios como este muy groseros. Estoy seguro de que sé cuál es la buena respuesta para mi pregunta, no necesito que me digas eso. Típico amdin BS. – majkinetor