sql >> Databasteknik >  >> RDS >> Sqlserver

Paginering i SQL - Prestandaproblem

Jag kontrollerar alltid hur mycket data jag kommer åt i frågan och försöker eliminera onödiga kolumner såväl som rader. Det här är bara uppenbara punkter som du kanske redan har kollat ​​men ville bara påpeka om du inte redan har gjort det. fråga den långsamma prestandan kan bero på att du gör "Välj *". Att välja alla kolumner från tabellen tillåter inte att komma med en bra utförandeplan. Kontrollera om du bara behöver valda kolumner och se till att du har korrekt täckande index på tabellorder.

Eftersom explicit SKIPP- eller OFFSET-funktion inte är tillgänglig i SQL 2008-versionen måste vi skapa en och som vi kan skapa med INNER JOIN. I en fråga kommer vi först att generera ID med OrderDate och inget annat kommer att finnas i den frågan. Vi gör samma sak i den andra frågan, men här väljer vi också några andra intresserade kolumner från tabellen ORDER eller ALL om du behöver ALL-kolumnen. Sedan ansluter vi till detta för att fråga resultat efter ID och OrderDate och ADD SKIPP rader filter för den första frågan där datamängden har sin minimala storlek vad som krävs. Prova den här koden.

    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. Finns det en mekanism för att inaktivera infogning i tabellen?

  2. Använder du jquery nedräkningstimer med mysql datetime?

  3. java jdbc mysql-kontakt:hur man löser frånkoppling efter en lång inaktivitetstid

  4. Laravel 5 vältalig vari