Ketika saya harus melihat masalah dengan caching rencana/kompilasi ulang kueri yang berlebihan di masa lalu, saya telah mengikuti panduan yang disediakan di whitepaper Microsoft 'Rencanakan Caching di SQL Server 2008' dan saya sangat menyarankan untuk membacanya karena mencakup caching rencana, penggunaan kembali rencana kueri, penyebab kompilasi ulang, mengidentifikasi kompilasi ulang, dan topik terkait lainnya.
Dengan demikian, SQL Server Profiler (Harus berada di bawah Microsoft SQL Server 2008 -> Performance Tools jika Anda menginstalnya sebagai bagian dari instalasi alat klien Anda) memperlihatkan tiga peristiwa yang terkait langsung dengan kompilasi kueri yang mungkin dapat membantu Anda:
- kursor
- CursorRecompile
- Kinerja
- Showplan XML Untuk Kompilasi Kueri
- Prosedur Tersimpan
- SP:Kompilasi ulang
Anda menggunakan Prosedur Tersimpan sehingga kemungkinan besar Anda hanya perlu khawatir tentang SP:Kompilasi ulang peristiwa. Acara ini akan diaktifkan setiap kali prosedur tersimpan, pemicu, atau fungsi yang ditentukan pengguna telah dikompilasi ulang. Kolom TextData akan menampilkan teks pernyataan tsql yang menyebabkan kompilasi ulang pernyataan dan kolom EventSubClass akan menampilkan kode yang menunjukkan alasan kompilasi ulang.
Kode EventSubClass untuk SP:Kompilasi Ulang di SQL 2008
- 1 =Skema Berubah
- 2 =Statistik Berubah
- 3 =Kompilasi ulang DNR
- 4 =Setel Opsi Berubah
- 5 =Tabel Temp Berubah
- 6 =Baris Jarak Jauh Berubah
- 7 =Untuk Izin Jelajah Diubah
- 8 =Lingkungan Pemberitahuan Kueri Berubah
- 9 =Tampilan MPI Berubah
- 10 =Opsi Kursor Diubah
- 11 =Dengan Opsi Kompilasi Ulang
Jika Anda memantau 5 peristiwa berikut, Anda akan dapat melihat prosedur dan pernyataan tersimpan mana yang dipanggil di SQL Server dan mana yang memicu kompilasi ulang:
- Prosedur Toko
- SP:Mulai
- SP:StmtMemulai
- SP:Kompilasi ulang
- SP:Selesai
- Kinerja
- Statistik Otomatis
Saya juga biasanya mengatur jejak Profiler untuk menangkap semua kolom untuk acara tersebut. Saya akan mengatakan atur jejak dengan 5 peristiwa itu, jalankan jejak selama 30 hingga 60 detik dan kemudian jeda dan kemudian Anda harus memiliki snapshot yang bagus tentang apa yang menyebabkan kompilasi ulang.
Jika ada terlalu banyak noise, Anda dapat mulai menambahkan filter kolom ke properti trace untuk memfilter peristiwa masuk/keluar. Misalnya jika Anda menemukan sebagian besar kompilasi ulang Anda terjadi hanya pada satu database, siapkan filter kolom pada kolom databaseID atau databaseName sehingga hanya kueri yang dijalankan terhadap database tersebut yang disertakan dalam jejak Anda.
Kemudian mulailah mencari pola di mana kueri sedang dikompilasi ulang dan gunakan whitepaper dari Microsoft sebagai panduan mengapa mereka mungkin memicu kompilasi ulang.