Jadi, saya punya fungsi yang mengembalikan sejumlah catatan yang ingin saya terapkan paging untuk situs web saya. Disarankan kepada saya agar saya menggunakan Offset / Fetch Next di SQL Server 2012 untuk mencapai ini. Di situs web kami, kami memiliki area yang mencantumkan jumlah total rekaman dan halaman apa yang Anda buka saat itu.
Sebelumnya, saya mendapatkan seluruh kumpulan rekor dan mampu membangun paging pada itu secara terprogram. Tetapi menggunakan cara SQL dengan HANYA FETCH NEXT X ROWS, saya hanya diberikan baris X kembali, jadi saya tidak tahu apa kumpulan record total saya dan bagaimana menghitung halaman min dan max saya. Satu-satunya cara saya tahu melakukan ini adalah memanggil fungsi dua kali dan melakukan hitungan baris pada baris pertama, lalu menjalankan yang kedua dengan FETCH NEXT. Adakah cara yang lebih baik agar saya tidak menjalankan kueri dua kali? Saya mencoba untuk mempercepat kinerja, bukan memperlambatnya.
sumber
Saya mengalami beberapa masalah kinerja menggunakan metode COUNT ( ) OVER (). (Saya tidak yakin apakah itu server karena butuh 40 detik untuk mengembalikan 10 catatan dan kemudian tidak memiliki masalah apa pun.) Teknik ini bekerja dalam semua kondisi tanpa harus menggunakan COUNT ( ) OVER () dan menyelesaikan hal yang sama:
DECLARE @PageSize INT = 10, @PageNum INT = 1; WITH TempResult AS( SELECT ID, Name FROM Table ), TempCount AS ( SELECT COUNT(*) AS MaxRows FROM TempResult ) SELECT * FROM TempResult, TempCount ORDER BY TempResult.Name OFFSET (@PageNum-1)*@PageSize ROWS FETCH NEXT @PageSize ROWS ONLY
sumber
Berdasarkan jawaban James Moberg :
Ini adalah penggunaan alternatif
Row_Number()
, jika Anda tidak memiliki SQL server 2012 dan Anda tidak dapat menggunakan OFFSETDECLARE @PageNumEnd INT = 10, @PageNum INT = 1; WITH TempResult AS( SELECT ID, NAME FROM Tabla ), TempCount AS ( SELECT COUNT(*) AS MaxRows FROM TempResult ) select * from ( SELECT ROW_NUMBER() OVER ( ORDER BY PolizaId DESC) AS 'NumeroRenglon', MaxRows, ID, Name FROM TempResult, TempCount )resultados WHERE NumeroRenglon >= @PageNum AND NumeroRenglon <= @PageNumEnd ORDER BY NumeroRenglon
sumber