Ada beberapa cara untuk memastikan kompilasi ulang prosedur tersimpan:
- menggunakan
WITH RECOMPILE
, - membuat prosedur tersimpan menjadi dinamis (pikirkan
exec()
) - menandai proc untuk dikompilasi ulang dengan
sp_recompile
. - mengubah skema yang diandalkan oleh rencana kueri yang di-cache
- memanggil
DBCC FREEPROCCACHE
- Pada tingkat kueri, pernyataan individual dalam proc dapat dikompilasi ulang dengan petunjuk kueri RECOMPILE (SQL 2008).
Faktor dalam Kompilasi Ulang
Selain faktor-faktor keras yang tercantum di atas, apa yang menyebabkan kompilasi ulang prosedur tersimpan? Yah, banyak hal. Beberapa di antaranya terjalin dengan daftar di atas, tetapi saya ingin menyajikannya kembali karena mungkin tidak terlalu jelas.
- Memasukkan atau menghapus banyak data (kepadatan data dalam indeks &tabel sering kali mengontrol rencana kueri)
- Membangun kembali indeks (perubahan pada objek yang mendasarinya)
- Membuat/menjatuhkan tabel sementara (sekali lagi, mendasari perubahan DML).
- paket kueri sudah habis (pikirkan tidak digunakan baru-baru ini dan sql ingin membersihkan penggunaan memori)
Ini sama sekali bukan daftar yang lengkap. Pengoptimal kueri berkembang dan mengejutkan tidak peduli berapa lama Anda telah menggunakan SQL Server. Tapi berikut adalah beberapa sumber yang mungkin berguna:
- Memecahkan masalah kompilasi ulang prosedur tersimpan (seorang tua, tapi baik)
- Melengkapi Prosedur Tersimpan
- Mengoptimalkan Prosedur Tersimpan SQL Server untuk Menghindari Kompilasi Ulang
- Caching dan Penggunaan Ulang Rencana Eksekusi (harus dibaca)
TAPI TUNGGU - ADA LAGI !
Dengan demikian, anggapan dalam pertanyaan Anda adalah bahwa kompilasi ulang selalu buruk untuk kinerja. Bahkan, seringkali pembalasan itu baik.
Jadi kapan Anda ingin mengkompilasi ulang? Mari kita lihat salah satu contoh proc yang mencari berdasarkan nama belakang. Prosedur tersimpan melakukan 'pengendus parameter
' yang merupakan berkah (jika bekerja untuk Anda) dan kutukan (jika bekerja melawan Anda). Lulus pertama seseorang menelusuri Zebr%
untuk zerbrowski. Indeks nama belakang menyadari ini sangat spesifik dan akan mengembalikan, katakanlah, 3 baris dari satu juta -- jadi satu rencana eksekusi dibuat. Dengan proc yang dikompilasi untuk hasil baris rendah, pencarian berikutnya adalah untuk S%
. Nah, S adalah nama Anda yang paling umum dan cocok dengan 93.543 baris dari 1 juta.