Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Paginação no SQL - Problema de desempenho


Eu sempre verifico quantos dados estou acessando na consulta e tento eliminar colunas desnecessárias, bem como linhas. consulta o desempenho lento pode ser porque você está fazendo “Selecionar *”. Selecionar todas as colunas da tabela não permite um bom plano de execução. Verifique se você precisa apenas de colunas selecionadas e certifique-se de ter o índice de cobertura correto na tabela Orders.

Como a função SKIPP ou OFFSET explícita não está disponível na versão SQL 2008, precisamos criar uma e que podemos criar por INNER JOIN. Em uma consulta, primeiro geraremos ID com OrderDate e nada mais estará nessa consulta. Fazemos o mesmo na segunda consulta, mas aqui também selecionamos algumas outras colunas interessadas da tabela ORDER ou ALL se você precisar da coluna ALL. o que é necessário. Experimente este código.
    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