Jag kontrollerar alltid hur mycket data jag kommer åt i frågan och försöker eliminera onödiga kolumner såväl som rader. Det här är bara uppenbara punkter som du kanske redan har kollat men ville bara påpeka om du inte redan har gjort det. fråga den långsamma prestandan kan bero på att du gör "Välj *". Att välja alla kolumner från tabellen tillåter inte att komma med en bra utförandeplan. Kontrollera om du bara behöver valda kolumner och se till att du har korrekt täckande index på tabellorder.
Eftersom explicit SKIPP- eller OFFSET-funktion inte är tillgänglig i SQL 2008-versionen måste vi skapa en och som vi kan skapa med INNER JOIN. I en fråga kommer vi först att generera ID med OrderDate och inget annat kommer att finnas i den frågan. Vi gör samma sak i den andra frågan, men här väljer vi också några andra intresserade kolumner från tabellen ORDER eller ALL om du behöver ALL-kolumnen. Sedan ansluter vi till detta för att fråga resultat efter ID och OrderDate och ADD SKIPP rader filter för den första frågan där datamängden har sin minimala storlek vad som krävs. Prova den här koden.
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