Orden de SQL Server 2008 ROW_NUMBER() por Clustered PK lento
Tengo una consulta simple a continuación que une 3 de mis tablas. Debido al hecho de que las instrucciones OFFSET y FETCH no están disponibles en SQL Server 2008, implementé ROW_NUMBER() en uno de mis informes de pedidos paginados.
SELECT * FROM
(
SELECT
ROW_NUMBER() OVER ( ORDER BY OrderProductDetail.ID ) AS RowNum,
*
FROM
Order JOIN
OrderProduct ON Order.ID = OrderProduct.OrderID JOIN
OrderProductDetail ON OrderProduct.ID = OrderProductDetail.OrderProductID
WHERE
Order.Date BETWEEN '2018-01-01 00:00:00.000' AND '2018-02-01 00:00:00.000'
) AS OrderDetailView
WHERE RowNum BETWEEN 1 AND 1000;
Con más de 16 millones de 3 millones de registros en la tabla, la consulta anterior tardó 1 minuto en completarse, los registros encontrados tienen un límite de 1000.
Sin embargo, si simplemente elimino RowNum en la cláusula WHERE, la consulta se completa en 3 segundos y se devuelve un total de 1700 registros. (También el mismo resultado si solo ejecuto la parte de Subconsulta)
SELECT * FROM
(
SELECT
ROW_NUMBER() OVER ( ORDER BY OrderProductDetail.ID ) AS RowNum,
*
FROM
Order JOIN
OrderProduct ON Order.ID = OrderProduct.OrderID JOIN
OrderProductDetail ON OrderProduct.ID = OrderProductDetail.OrderProductID
WHERE
Order.Date BETWEEN '2018-01-01 00:00:00.000' AND '2018-02-01 00:00:00.000'
) AS OrderDetailView
- Order.ID = PK agrupado único (Int)
- Pedido.Fecha = Índice no agrupado (marca de tiempo)
- OrderProduct.ID = PK agrupado único (Int)
- DetalleProductoPedido.ID = PK agrupado único (Int)
Algunos otros casos de prueba que he realizado:
- ( ORDER BY Order.Date ) AS RowNumber> Fast
- ( ORDER BY Order.ID ) AS RowNumber> Rápido
Pregunta: ¿Cómo puedo mejorar el rendimiento?
Mostrar la mejor respuesta