Saya memiliki Employee
tabel yang memiliki satu juta catatan. Saya telah mengikuti SQL untuk paging data dalam aplikasi web. Ini bekerja dengan baik. Namun apa yang saya lihat sebagai masalah adalah - tabel turunan tblEmployee
memilih semua rekaman dalam Employee
tabel (untuk membuat MyRowNumber
nilai).
Saya pikir, ini menyebabkan pemilihan semua catatan dalam Employee
tabel.
Apakah ini benar-benar berfungsi? Atau SQL Server dioptimalkan untuk memilih hanya 5 catatan dari Employee
tabel asli juga?
DECLARE @Index INT;
DECLARE @PageSize INT;
SET @Index = 3;
SET @PageSize = 5;
SELECT * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY EmpID asc) as MyRowNumber,*
FROM Employee) tblEmployee
WHERE MyRowNumber BETWEEN ( ((@Index - 1) * @PageSize )+ 1) AND @Index*@PageSize
Jawaban:
Alternatif untuk menguji mungkin:
Ya, Anda menekan tabel dua kali, tetapi di CTE di mana Anda memindai seluruh tabel Anda hanya meraih kunci, bukan SEMUA data. Tetapi Anda benar-benar harus melihat artikel ini:
http://www.sqlservercentral.com/articles/T-SQL/66030/
Dan diskusi lanjutan:
http://www.sqlservercentral.com/Forums/Topic672980-329-1.aspx
Dalam SQL Server 2012 tentu saja Anda dapat menggunakan
OFFSET
/FETCH NEXT
sintaks baru:sumber
Meskipun Anda mungkin tidak tahu mekanisme di baliknya, Anda dapat mengujinya sendiri dengan membandingkan kinerja kueri Anda dengan: pilih * dari Karyawan.
Versi terbaru dari SQL Server melakukan pekerjaan yang cukup baik untuk mengoptimalkan, tetapi dapat bergantung pada beberapa faktor.
Bagaimana kinerja fungsi ROW_NUMBER Anda akan didorong oleh klausa Pesanan Menurut. Dalam contoh Anda, sebagian besar akan menebak EmpID adalah kunci utama.
Ada beberapa di mana klausul yang begitu kompleks dan / atau kode buruk atau diindeks, Anda mungkin akan lebih baik hanya mengembalikan seluruh dataset (itu langka dan bisa diperbaiki). Menggunakan ANTARA memiliki masalah.
Sebelum Anda menganggap akan lebih baik untuk mengembalikan semua baris ke aplikasi Anda dan membiarkannya mengetahuinya, Anda harus berupaya mengoptimalkan kueri Anda. Periksa estimasi. Tanyakan Query Analyzer. Uji beberapa alternatif.
sumber
Saya tahu pertanyaannya adalah tentang row_number () tetapi saya ingin menambahkan satu fitur baru dari sql server 2012. Dalam sql server 2012 fitur baru OFFSET Ambil berikutnya yang diperkenalkan dan sangat cepat daripada row_number (). Saya sudah menggunakannya dan itu memberi saya hasil yang baik berharap kalian juga mengisi pengalaman yang sama.
Saya menemukan satu contoh di http://blogfornet.com/2013/06/sql-server-2012-offset-use/
yang bermanfaat. Semoga ini akan membantu Anda juga untuk mengimplementasikan fitur-fitur baru ....
sumber
Saya tidak berpikir itu mengevaluasi untuk mengembalikan semua baris di tabel asli. SQL server mengoptimalkan. Kalau tidak, akan membutuhkan banyak waktu untuk memilih satu juta entri. Saat ini saya menggunakan ini dan itu jauh lebih cepat daripada memilih semua baris. Jadi, pasti tidak mendapatkan semua baris. Namun itu lebih lambat daripada hanya mengambil lima baris pertama, mungkin karena waktu yang dibutuhkan untuk memesan
sumber
sumber