Controllo sempre la quantità di dati a cui accedo nella query e provo a eliminare le colonne e le righe non necessarie. Bene, questi sono solo punti ovvi che potresti aver già verificato ma che volevi solo sottolineare nel caso non lo avessi già fatto. Nel tuo interrogare che le prestazioni lente potrebbero essere dovute al fatto che stai facendo "Seleziona *". La selezione di tutte le colonne dalla tabella non consente di avere un buon piano di esecuzione. Verifica se hai bisogno solo di colonne selezionate e assicurati di avere l'indice di copertura corretto sugli ordini della tabella.
Poiché la funzione SKIPP o OFFSET esplicita non è disponibile nella versione SQL 2008, è necessario crearne una e che possiamo creare tramite INNER JOIN. In una query genereremo prima l'ID con OrderDate e nient'altro sarà in quella query. Facciamo lo stesso nella seconda query, ma qui selezioniamo anche alcune altre colonne interessate dalla tabella ORDINE o TUTTO se hai bisogno della colonna TUTTA. Quindi uniamo questo per interrogare i risultati per ID e OrderDate e AGGIUNGI il filtro delle righe SKIPP per la prima query in cui il set di dati è alla sua dimensione minima cosa è richiesto. Prova questo codice.
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