Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Pagination dalam SQL - Masalah kinerja

Saya selalu memeriksa berapa banyak data yang saya akses dalam kueri dan mencoba untuk menghilangkan kolom dan baris yang tidak perlu. Nah ini adalah poin yang jelas yang mungkin sudah Anda periksa namun hanya ingin ditunjukkan jika Anda belum melakukannya. kueri kinerja yang lambat mungkin karena Anda melakukan "Pilih *". Memilih semua kolom dari tabel tidak memungkinkan untuk datang dengan rencana Eksekusi yang baik. Periksa apakah Anda hanya membutuhkan kolom yang dipilih dan pastikan Anda memiliki indeks penutup yang benar pada Pesanan tabel.

Karena fungsi SKIPP atau OFFSET eksplisit tidak tersedia dalam versi SQL 2008 kita perlu membuatnya dan itu dapat kita buat dengan INNER JOIN. Dalam satu query pertama-tama kita akan menghasilkan ID dengan OrderDate dan tidak ada lagi yang akan ada di query itu. Kami melakukan hal yang sama dalam kueri kedua tetapi di sini kami juga memilih beberapa kolom lain yang tertarik dari tabel ORDER atau ALL jika Anda membutuhkan ALL kolom. Kemudian kami GABUNG ini untuk hasil kueri dengan ID dan OrderDate dan ADD SKIPP baris filter untuk kueri pertama di mana kumpulan data berada pada ukuran minimal apa yang diperlukan. Coba kode ini.

    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. Permintaan SQL untuk mendapatkan hasil dalam dua kolom saja

  2. Dapatkan baris sebelumnya dan berikutnya dari baris yang dipilih dengan kondisi (WHERE)

  3. Bagaimana saya bisa membuat daftar semua kunci asing yang mereferensikan tabel yang diberikan di SQL Server?

  4. Konfigurasikan Pekerjaan SQL di SQL Server menggunakan T-SQL

  5. Bagaimana Anda memodelkan pewarisan secara efektif dalam database?