Zawsze sprawdzam, ile danych uzyskuję w zapytaniu i staram się wyeliminować niepotrzebne kolumny, a także wiersze. Cóż, są to tylko oczywiste punkty, które mogłeś już sprawdzić, ale chciałeś tylko wskazać, jeśli jeszcze tego nie zrobiłeś. zapytanie niska wydajność może wynikać z tego, że robisz "Wybierz *". Wybranie wszystkich kolumn z tabeli nie pozwala na uzyskanie dobrego planu wykonania.Sprawdź, czy potrzebujesz tylko wybranych kolumn i upewnij się, że masz prawidłowy indeks pokrycia w zamówieniach tabeli.
Ponieważ jawna funkcja SKIPP lub OFFSET nie jest dostępna w wersji SQL 2008, musimy ją utworzyć i możemy ją utworzyć za pomocą INNER JOIN. W jednym zapytaniu najpierw wygenerujemy ID z OrderDate i nic więcej nie będzie w tym zapytaniu. w drugim zapytaniu, ale tutaj również wybieramy inne interesujące kolumny z tabeli ORDER lub ALL, jeśli potrzebujesz kolumny ALL. Następnie łączymy to, aby uzyskać wyniki zapytania według ID i OrderDate oraz filtr wierszy ADD SKIPP dla pierwszego zapytania, w którym zestaw danych ma minimalny rozmiar co jest wymagane.Wypróbuj ten kod.
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