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

cara yang efisien untuk mengimplementasikan paging

Mencoba memberikan jawaban singkat atas keraguan Anda, jika Anda menjalankan skip(n).take(m) metode pada linq (dengan SQL 2005/2008 sebagai server database) kueri Anda akan menggunakan Select ROW_NUMBER() Over ... pernyataan, dengan entah bagaimana langsung paging di mesin SQL.

Memberi Anda contoh, saya memiliki tabel db bernama mtcity dan saya menulis kueri berikut (berfungsi juga dengan linq to entity):

using (DataClasses1DataContext c = new DataClasses1DataContext())
{
    var query = (from MtCity2 c1 in c.MtCity2s
                select c1).Skip(3).Take(3);
    //Doing something with the query.
}

Kueri yang dihasilkan akan menjadi:

SELECT [t1].[CodCity], 
    [t1].[CodCountry], 
    [t1].[CodRegion], 
    [t1].[Name],  
    [t1].[Code]
FROM (
    SELECT ROW_NUMBER() OVER (
        ORDER BY [t0].[CodCity], 
        [t0].[CodCountry], 
        [t0].[CodRegion], 
        [t0].[Name],
        [t0].[Code]) AS [ROW_NUMBER], 
        [t0].[CodCity], 
        [t0].[CodCountry], 
        [t0].[CodRegion], 
        [t0].[Name],
        [t0].[Code]
    FROM [dbo].[MtCity] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]

Yang merupakan akses data berjendela (cukup keren, btw karena akan mengembalikan data sejak awal dan akan mengakses tabel selama kondisinya terpenuhi). Ini akan sangat mirip dengan:

With CityEntities As 
(
    Select ROW_NUMBER() Over (Order By CodCity) As Row,
        CodCity //here is only accessed by the Index as CodCity is the primary
    From dbo.mtcity
)
Select [t0].[CodCity], 
        [t0].[CodCountry], 
        [t0].[CodRegion], 
        [t0].[Name],
        [t0].[Code]
From CityEntities c
Inner Join dbo.MtCity t0 on c.CodCity = t0.CodCity
Where c.Row Between @p0 + 1 AND @p0 + @p1
Order By c.Row Asc

Dengan pengecualian bahwa, kueri kedua ini akan dieksekusi lebih cepat daripada hasil linq karena akan menggunakan indeks secara eksklusif untuk membuat jendela akses data; ini berarti, jika Anda memerlukan beberapa pemfilteran, pemfilteran harus (atau harus) dalam daftar Entitas (tempat baris dibuat) dan beberapa indeks harus dibuat juga untuk menjaga kinerja yang baik.

Sekarang, apa yang lebih baik?

Jika Anda memiliki alur kerja yang cukup solid dalam logika Anda, menerapkan cara SQL yang tepat akan menjadi rumit. Dalam hal ini LINQ akan menjadi solusinya.

Jika Anda dapat menurunkan bagian logika itu langsung ke SQL (dalam prosedur tersimpan), itu akan menjadi lebih baik karena Anda dapat mengimplementasikan kueri kedua yang saya tunjukkan (menggunakan indeks) dan mengizinkan SQL untuk menghasilkan dan menyimpan Rencana Eksekusi dari kueri (meningkatkan kinerja).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana menjalankan kueri yang sama pada semua database pada sebuah instance?

  2. Mengapa CTE lebih baik daripada kursor/tabel turunan/subqueries/tabel temp dll?

  3. Cara Tercepat untuk Menemukan Fitur Usang yang Masih Digunakan di Instance SQL Server (Contoh T-SQL)

  4. Menghapus Profil Email Database (SSMS)

  5. Dapatkan 1 baris teratas setiap grup