sql >> Database >  >> RDS >> Sqlserver

Paginering in SQL - Prestatieprobleem

Ik controleer altijd tot hoeveel gegevens ik toegang heb in een zoekopdracht en probeer niet-noodzakelijke kolommen en rijen te elimineren. query de trage prestaties kan zijn omdat u "Selecteer *" doet. Het selecteren van alle kolommen uit de tabel staat niet toe dat er een goed uitvoeringsplan komt. Controleer of u alleen geselecteerde kolommen nodig heeft en zorg ervoor dat u de juiste dekkingsindex op tafelorders heeft.

Omdat de expliciete SKIPP- of OFFSET-functie niet beschikbaar is in de SQL 2008-versie, moeten we er een maken en die kunnen we maken door INNER JOIN. In één query zullen we eerst een ID genereren met OrderDate en niets anders zal in die query staan. We doen hetzelfde in de tweede zoekopdracht, maar hier selecteren we ook enkele andere geïnteresseerde kolommen uit de tabel ORDER of ALL als je ALL-kolom nodig hebt. wat is vereist.Probeer deze 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



  1. Kunnen dubbele aanhalingstekens worden gebruikt om een ​​string af te bakenen?

  2. Onderschat ik MySQL?

  3. Hoe een externe sleutelbeperking te maken met ON UPDATE CASCADE in SQL Server - SQL Server / TSQL-zelfstudie, deel 79

  4. SQL-syntaxisfout in de buurt van desc