Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Impaginazione in SQL - Problema di prestazioni

Controllo sempre la quantità di dati a cui accedo nella query e provo a eliminare le colonne e le righe non necessarie. Bene, questi sono solo punti ovvi che potresti aver già verificato ma che volevi solo sottolineare nel caso non lo avessi già fatto. Nel tuo interrogare che le prestazioni lente potrebbero essere dovute al fatto che stai facendo "Seleziona *". La selezione di tutte le colonne dalla tabella non consente di avere un buon piano di esecuzione. Verifica se hai bisogno solo di colonne selezionate e assicurati di avere l'indice di copertura corretto sugli ordini della tabella.

Poiché la funzione SKIPP o OFFSET esplicita non è disponibile nella versione SQL 2008, è necessario crearne una e che possiamo creare tramite INNER JOIN. In una query genereremo prima l'ID con OrderDate e nient'altro sarà in quella query. Facciamo lo stesso nella seconda query, ma qui selezioniamo anche alcune altre colonne interessate dalla tabella ORDINE o TUTTO se hai bisogno della colonna TUTTA. Quindi uniamo questo per interrogare i risultati per ID e OrderDate e AGGIUNGI il filtro delle righe SKIPP per la prima query in cui il set di dati è alla sua dimensione minima cosa è richiesto. Prova questo codice.

    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