Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pagination en SQL - Problème de performances

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