Selama bertahun-tahun tumpukan keringat pengembang telah masuk ke set hasil paging yang efisien. Namun, tidak ada satu jawaban - itu tergantung pada kasus penggunaan Anda. Bagian dari kasus penggunaan adalah mendapatkan halaman Anda secara efisien, sebagian lagi mencari tahu berapa banyak baris dalam kumpulan hasil yang lengkap. Maaf jika saya sedikit menyimpang ke paging, tetapi keduanya cukup erat dalam pikiran saya.
Ada banyak strategi, yang sebagian besar buruk jika Anda memiliki volume data apa pun &tidak sesuai dengan kasus penggunaan. Meskipun ini bukan daftar lengkap, berikut adalah beberapa opsinya.....
Jalankan Count(*)
Separate
- jalankan kueri terpisah yang melakukan "hitungan pilihan(*) sederhana dari MyTable"
- sederhana dan mudah untuk meja kecil
- baik pada tabel besar tanpa filter yang sempit atau memiliki indeks non-cluster yang ringkas, Anda dapat menggunakan
- rusak saat Anda memiliki
WHERE/JOIN
yang rumit kriteria karena menjalankanWHERE/JOIN
dua kali mahal. - dipecah pada indeks lebar karena jumlah pembacaan meningkat.
Gabungkan ROW_Number() OVER()
dan COUNT(1) OVER(PARTITION By 1)
- Ini disarankan oleh @RBarryYoung. Ini memiliki manfaat karena penerapannya yang sederhana dan sangat fleksibel.
- Sisi buruknya adalah ada banyak alasan mengapa hal ini bisa menjadi sangat mahal dengan cepat.
- Misalnya, dalam DB yang sedang saya kerjakan, ada tabel Media dengan sekitar 6000 baris. Ini tidak terlalu lebar, memiliki PK berkerumun bilangan bulat dan, serta indeks unik yang ringkas. Namun,
COUNT(*) OVER(PARTITION BY 1) as TotalRows
menghasilkan ~12.000 pembacaan. Bandingkan denganSELECT COUNT(*) FROM Media
simple sederhana -- 12 bacaan. Wowzer.
Tabel Suhu / Variabel Tabel
- Ada banyak strategi yang mengambil kumpulan hasil dan memasukkan kunci atau segmen hasil yang relevan ke dalam tabel sementara/variabel tabel.
- Untuk kumpulan hasil berukuran kecil/sedang, ini dapat memberikan hasil yang luar biasa.
- Jenis strategi ini bekerja di hampir semua platform/versi SQL.
- Mengoperasikan hasil yang ditetapkan beberapa kali (cukup sering menjadi persyaratan) juga mudah.
- Sisi buruknya adalah ketika bekerja dengan kumpulan hasil yang besar ... memasukkan beberapa juta baris ke dalam tabel temp memiliki biaya.
- Memperparah masalah, dalam tekanan sistem volume tinggi pada TempDB bisa menjadi faktor yang cukup besar, dan tabel temp secara efektif bekerja di TempDB.
Jumlah Gaussian / Nomor Baris Ganda
- Ide ini bergantung pada subset dari sesuatu yang ditemukan oleh ahli matematika Gauss (cara menjumlahkan serangkaian angka). Subset adalah cara mendapatkan jumlah baris dari titik mana pun dalam tabel.
- Dari serangkaian angka (
Row_Number()
) jumlah baris dari 1 sampai N adalah(N + 1) - 1
. Penjelasan lebih lanjut di tautan. - Rumusnya sepertinya hanya akan menjadi N, tetapi jika Anda tetap menggunakan rumus tersebut, hal yang menarik terjadi, Anda dapat mengetahui jumlah baris dari halaman di tengah tabel.
- Hasil bersihnya adalah Anda melakukan
ROW_Number() OVER(Order by ID)
danROW_Number() OVER(Order by ID DESC)
lalu jumlahkan kedua angka tersebut dan kurangi 1. - Menggunakan tabel Media saya sebagai contoh, pembacaan saya turun dari 12.000 menjadi sekitar 75.
- Di halaman yang lebih besar, Anda akhirnya mengulang data berkali-kali, tetapi offset dalam pembacaan mungkin sepadan.
- Saya belum menguji ini di terlalu banyak skenario, jadi mungkin gagal di skenario lain.
Atas (@n) / SET ROWCOUNT
- Ini bukan strategi khusus, tetapi pengoptimalan berdasarkan apa yang kami ketahui tentang pengoptimal kueri.
- Secara kreatif menggunakan Top(@n) [top dapat menjadi variabel dalam SQL 2008] atau SET ROWCOUNT dapat mengurangi set kerja Anda ...bahkan jika Anda menarik halaman tengah dari kumpulan hasil, Anda masih dapat mempersempit hasilnya
- Ide ini berfungsi karena perilaku pengoptimal kueri ...paket layanan/perbaikan terbaru dapat mengubah perilaku (walaupun mungkin tidak).
- Dalam beberapa kasus, SET ROWCOUNT bisa sedikit akurat
- Strategi ini tidak memperhitungkan jumlah baris penuh, hanya membuat paging lebih efisien
Jadi apa yang harus dilakukan pengembang?
Baca orang baikku, baca. Berikut adalah beberapa artikel yang saya sandarkan...
- Metode yang Lebih Efisien untuk Paging Melalui Kumpulan Hasil Besar
- Mengoptimalkan Paging Sisi Server - Bagian I
- Mengoptimalkan Paging Sisi Server - Bagian II
- Penjelasan Jumlah Gaussian
- Mengembalikan Hasil Peringkat dengan Microsoft SQL Server 2005
- ROW_NUMBER() OVER Tidak Cukup Cepat Dengan Set Hasil Besar
- Mengambil Catatan N Pertama dari Kueri SQL
- Server Side Paging menggunakan SQL Server 2005
- Mengapa pembacaan logis untuk fungsi agregat berjendela sangat tinggi?
Semoga membantu.