Je vérifie toujours la quantité de données auxquelles j'accède dans la requête et j'essaie d'éliminer les colonnes ainsi que les lignes non nécessaires. interroger la lenteur des performances peut être due au fait que vous faites "Sélectionner *". La sélection de toutes les colonnes de la table ne permet pas d'obtenir un bon plan d'exécution. Vérifiez si vous n'avez besoin que de colonnes sélectionnées et assurez-vous d'avoir un index de couverture correct sur la table Orders.
Parce que la fonction explicite SKIPP ou OFFSET n'est pas disponible dans la version SQL 2008, nous devons en créer une et que nous pouvons créer par INNER JOIN. Dans une requête, nous allons d'abord générer un ID avec OrderDate et rien d'autre ne sera dans cette requête. Nous faisons de même dans la deuxième requête, mais ici, nous sélectionnons également d'autres colonnes intéressées de la table ORDER ou ALL si vous avez besoin de la colonne ALL.Ensuite, nous JOIN ceci pour interroger les résultats par ID et OrderDate et ADD SKIPP filtres de lignes pour la première requête où l'ensemble de données est à sa taille minimale ce qui est requis. Essayez ce 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