Ik controleer altijd tot hoeveel gegevens ik toegang heb in een zoekopdracht en probeer niet-noodzakelijke kolommen en rijen te elimineren. query de trage prestaties kan zijn omdat u "Selecteer *" doet. Het selecteren van alle kolommen uit de tabel staat niet toe dat er een goed uitvoeringsplan komt. Controleer of u alleen geselecteerde kolommen nodig heeft en zorg ervoor dat u de juiste dekkingsindex op tafelorders heeft.
Omdat de expliciete SKIPP- of OFFSET-functie niet beschikbaar is in de SQL 2008-versie, moeten we er een maken en die kunnen we maken door INNER JOIN. In één query zullen we eerst een ID genereren met OrderDate en niets anders zal in die query staan. We doen hetzelfde in de tweede zoekopdracht, maar hier selecteren we ook enkele andere geïnteresseerde kolommen uit de tabel ORDER of ALL als je ALL-kolom nodig hebt. wat is vereist.Probeer deze code.
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