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

Bagaimana mengonversi eksekusi Baris demi baris ke pendekatan berbasis SET di SQL

Sampai struktur tabel dan data sampel hasil yang diharapkan tidak disediakan, berikut adalah beberapa hal cepat yang saya lihat dapat diperbaiki (beberapa di antaranya telah disebutkan oleh orang lain di atas):

  1. WHILE Loop juga merupakan kursor. Jadi, mengubah ke while loop tidak akan membuat segalanya lebih cepat.
  2. Gunakan kursor LOCAL FAST_FORWARD kecuali jika Anda perlu melacak kembali rekaman. Ini akan membuat eksekusi lebih cepat.
  3. Ya, saya setuju bahwa memiliki pendekatan berbasis SET akan menjadi yang tercepat dalam banyak kasus, namun jika Anda harus menyimpan hasil antara di suatu tempat, saya sarankan menggunakan tabel temp alih-alih variabel tabel. Tabel sementara adalah 'kurang jahat' di antara 2 opsi ini. Berikut adalah beberapa alasan mengapa Anda harus menghindari penggunaan variabel tabel:

    • Karena SQL Server tidak akan memiliki statistik sebelumnya pada variabel tabel selama membangun Rencana Eksekusi, itu akan selalu mempertimbangkan bahwa hanya satu catatan yang akan dikembalikan oleh variabel tabel selama konstruksi rencana eksekusi. Dan karenanya Storage Engine hanya akan menetapkan memori RAM sebanyak itu untuk eksekusi kueri. Namun pada kenyataannya, mungkin ada jutaan catatan yang mungkin disimpan oleh variabel tabel selama eksekusi. Jika itu terjadi, SQL Server akan dipaksa menumpahkan data ke hard disk selama eksekusi (dan Anda akan melihat banyak PAGEIOLATCH di sys.dm_os_wait_stats) membuat kueri menjadi lebih lambat.
    • Salah satu cara untuk menghilangkan masalah di atas adalah dengan memberikan petunjuk level pernyataan OPTION (RECOMPILE) di akhir setiap kueri tempat nilai tabel digunakan. Ini akan memaksa SQL Server untuk membuat Rencana Eksekusi dari kueri tersebut setiap kali selama runtime dan masalah alokasi memori yang lebih sedikit dapat dihindari. Namun kelemahannya adalah:SQL Server tidak lagi dapat mengambil keuntungan dari rencana eksekusi yang sudah di-cache untuk prosedur tersimpan itu, dan akan memerlukan kompilasi ulang setiap saat, yang akan menurunkan kinerja sampai batas tertentu. Jadi, kecuali Anda mengetahui bahwa data dalam tabel yang mendasarinya sering berubah atau prosedur tersimpan itu sendiri tidak sering dijalankan, pendekatan ini tidak direkomendasikan oleh Microsoft MVPs.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kinerja Query SQL Server 2005

  2. Penggunaan SqlParameter dalam klausa SEPERTI SQL tidak berfungsi

  3. Apakah lebih baik menjalankan banyak perintah sql dengan satu koneksi, atau menyambung kembali setiap saat?

  4. Mengganti string panjang variabel dengan beberapa kata

  5. SQL Server:perbedaan hari untuk dua tanggal di baris terpisah