sql >> Base de Datos >  >> RDS >> Sqlserver

Paginación en SQL:problema de rendimiento

Siempre verifico la cantidad de datos a los que accedo en la consulta y trato de eliminar columnas y filas innecesarias. Bueno, estos son solo puntos obvios que quizás ya haya verificado pero que solo quería señalar en caso de que aún no lo haya hecho. En su consulta, el rendimiento lento podría deberse a que está haciendo "Seleccionar *". La selección de todas las columnas de la tabla no permite tener un buen plan de ejecución. Compruebe si solo necesita columnas seleccionadas y asegúrese de tener el índice de cobertura correcto en las órdenes de la tabla.

Debido a que la función SKIPP o OFFSET explícita no está disponible en la versión de SQL 2008, necesitamos crear una y podemos crearla mediante INNER JOIN. En una consulta, primero generaremos ID con OrderDate y no habrá nada más en esa consulta. Hacemos lo mismo en la segunda consulta, pero aquí también seleccionamos algunas otras columnas interesadas de la tabla ORDEN o TODAS si necesita TODAS las columnas. Luego, UNIMOS esto para consultar los resultados por ID y OrderDate y AGREGAR el filtro de filas SKIPP para la primera consulta donde el conjunto de datos está en su tamaño mínimo lo que se requiere. Pruebe 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