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

Cara efisien untuk mendapatkan @@rowcount dari kueri menggunakan row_number

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 menjalankan WHERE/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 dengan SELECT 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) dan ROW_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...

Semoga membantu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menghapus karakter tertentu dari string, hanya jika itu adalah karakter pertama atau terakhir dalam string.

  2. BATAS 10..20 di SQL Server

  3. Bisakah saya mengulang variabel tabel di T-SQL?

  4. Apa metode terbaik untuk meneruskan parameter ke SQLCommand?

  5. Cara menggunakan Pernyataan Kasus untuk Pemformatan Bersyarat di Kueri Pilih - Tutorial SQL Server / TSQL Bagian 116