Eu sempre verifico quantos dados estou acessando na consulta e tento eliminar colunas desnecessárias, bem como linhas. consulta o desempenho lento pode ser porque você está fazendo “Selecionar *”. Selecionar todas as colunas da tabela não permite um bom plano de execução. Verifique se você precisa apenas de colunas selecionadas e certifique-se de ter o índice de cobertura correto na tabela Orders.
Como a função SKIPP ou OFFSET explícita não está disponível na versão SQL 2008, precisamos criar uma e que podemos criar por INNER JOIN. Em uma consulta, primeiro geraremos ID com OrderDate e nada mais estará nessa consulta. Fazemos o mesmo na segunda consulta, mas aqui também selecionamos algumas outras colunas interessadas da tabela ORDER ou ALL se você precisar da coluna ALL. o que é necessário. Experimente 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