Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Paginacja w SQL - problem z wydajnością

Zawsze sprawdzam, ile danych uzyskuję w zapytaniu i staram się wyeliminować niepotrzebne kolumny, a także wiersze. Cóż, są to tylko oczywiste punkty, które mogłeś już sprawdzić, ale chciałeś tylko wskazać, jeśli jeszcze tego nie zrobiłeś. zapytanie niska wydajność może wynikać z tego, że robisz "Wybierz *". Wybranie wszystkich kolumn z tabeli nie pozwala na uzyskanie dobrego planu wykonania.Sprawdź, czy potrzebujesz tylko wybranych kolumn i upewnij się, że masz prawidłowy indeks pokrycia w zamówieniach tabeli.

Ponieważ jawna funkcja SKIPP lub OFFSET nie jest dostępna w wersji SQL 2008, musimy ją utworzyć i możemy ją utworzyć za pomocą INNER JOIN. W jednym zapytaniu najpierw wygenerujemy ID z OrderDate i nic więcej nie będzie w tym zapytaniu. w drugim zapytaniu, ale tutaj również wybieramy inne interesujące kolumny z tabeli ORDER lub ALL, jeśli potrzebujesz kolumny ALL. Następnie łączymy to, aby uzyskać wyniki zapytania według ID i OrderDate oraz filtr wierszy ADD SKIPP dla pierwszego zapytania, w którym zestaw danych ma minimalny rozmiar co jest wymagane.Wypróbuj ten kod.

    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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Obetnij tabelę w ramach transakcji

  2. Konwersja typu danych datetime2 na typ danych datetime wynika z wartości spoza zakresu

  3. Jak utworzyć unikatowe ograniczenie, które również dopuszcza wartości null?

  4. Najszybszy sposób przesyłania danych tabeli Excel do SQL 2008R2

  5. Interfejsy sieciowe SQL, błąd:50 — wystąpił błąd w czasie wykonywania lokalnej bazy danych. Nie można utworzyć automatycznej instancji