Siempre verifico la cantidad de datos a los que accedo en la consulta y trato de eliminar columnas y filas innecesarias. Bueno, estos son solo puntos obvios que quizás ya haya verificado pero que solo quería señalar en caso de que aún no lo haya hecho. En su consulta, el rendimiento lento podría deberse a que está haciendo "Seleccionar *". La selección de todas las columnas de la tabla no permite tener un buen plan de ejecución. Compruebe si solo necesita columnas seleccionadas y asegúrese de tener el índice de cobertura correcto en las órdenes de la tabla.
Debido a que la función SKIPP o OFFSET explícita no está disponible en la versión de SQL 2008, necesitamos crear una y podemos crearla mediante INNER JOIN. En una consulta, primero generaremos ID con OrderDate y no habrá nada más en esa consulta. Hacemos lo mismo en la segunda consulta, pero aquí también seleccionamos algunas otras columnas interesadas de la tabla ORDEN o TODAS si necesita TODAS las columnas. Luego, UNIMOS esto para consultar los resultados por ID y OrderDate y AGREGAR el filtro de filas SKIPP para la primera consulta donde el conjunto de datos está en su tamaño mínimo lo que se requiere. Pruebe este código.
SELECT q2.*
FROM
(
SELECT ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum, OrderDate
FROM Orders
WHERE OrderDate >= '1980-01-01'
)q1
INNER JOIN
(
SELECT ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum, *
FROM Orders
WHERE OrderDate >= '1980-01-01'
)q2
ON q1.RowNum=q2.RowNum AND q1.OrderDate=q2.OrderDate AND q1.rownum BETWEEN 30000 AND 30020
IF object_id('TestSelect','u') IS NOT NULL
DROP TABLE TestSelect
GO
CREATE TABLE TestSelect
(
OrderDate DATETIME2(2)
)
GO
DECLARE @i bigint=1, @dt DATETIME2(2)='01/01/1700'
WHILE @I<=2000000
BEGIN
IF @i%15 = 0
SELECT @DT = DATEADD(DAY,1,@dt)
INSERT INTO dbo.TestSelect( OrderDate )
SELECT @dt
SELECT @[email protected]+1
END
SELECT q2.*
FROM
(
SELECT ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum
,OrderDate
FROM TestSelect
WHERE OrderDate >= '1700-01-01'
)q1
INNER JOIN
(
SELECT ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum
,*
FROM TestSelect
WHERE OrderDate >= '1700-01-01'
)q2
ON q1.RowNum=q2.RowNum
AND q1.OrderDate=q2.OrderDate
AND q1.RowNum BETWEEN 50000 AND 50010