Винаги проверявам до колко данни имам достъп в заявката и се опитвам да премахна ненужните колони, както и редове. Е, това са само очевидни точки, които може би вече сте проверили, но просто исках да посочите, в случай че още не сте го направили. заявка, че бавната производителност може да се дължи на това, че правите „Изберете *“. Избирането на всички колони от таблицата не позволява получаването на добър план за изпълнение. Проверете дали имате нужда само от избрани колони и се уверете, че имате правилен покриващ индекс в Поръчките на таблицата.
Тъй като изричната функция SKIPP или OFFSET не е налична във версията на SQL 2008, трябва да създадем такава и да можем да я създадем чрез INNER JOIN. В една заявка първо ще генерираме ID с OrderDate и нищо друго няма да има в тази заявка. Правим същото във втората заявка, но тук също избираме някои други заинтересовани колони от таблицата ORDER или ALL, ако имате нужда от колона ALL. След това се ПРИСЪЕДИНЯВАМЕ към това, за да търсим резултати по ID и OrderDate и ДОБАВЯНЕ НА ПРОПУСКАНЕ на редове филтър за първата заявка, където наборът от данни е в минималния си размер какво се изисква. Опитайте този код.
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