Saya memiliki dua kueri yang hampir sama, berjalan pada contoh SQL Server 2005 yang sama:
- Yang pertama adalah
SELECT
permintaan asli yang dihasilkan oleh LINQ (saya tahu, saya tahu ... Saya bukan pengembang aplikasi, hanya DBA :). - Yang kedua persis sama dengan yang pertama, ditambahkan
OPTION (RECOMPILE)
di akhir.
Tidak ada lagi yang berubah.
Yang pertama membutuhkan 55 detik setiap kali dijalankan.
Yang kedua membutuhkan waktu 2 detik.
Kedua set hasil identik.
Mengapa petunjuk ini menghasilkan keuntungan dramatis dalam kinerja?
Entri Buku Daring pada RECOMPILE
tidak menawarkan penjelasan yang lebih terperinci:
Menginstruksikan Mesin Database SQL Server untuk membuang rencana yang dihasilkan untuk permintaan setelah dijalankan, memaksa pengoptimal permintaan untuk mengkompilasi ulang rencana permintaan saat berikutnya permintaan yang sama dijalankan. Tanpa menentukan RECOMPILE, Mesin Basis Data cache rencana kueri dan menggunakannya kembali. Saat menyusun rencana kueri, petunjuk kueri RECOMPILE menggunakan nilai saat ini dari variabel lokal apa pun dalam kueri dan, jika kueri berada di dalam prosedur tersimpan, nilai saat ini diteruskan ke parameter apa pun.
RECOMPILE adalah alternatif yang berguna untuk membuat prosedur tersimpan yang menggunakan klausa WITH RECOMPILE ketika hanya sebagian dari kueri di dalam prosedur tersimpan, alih-alih seluruh prosedur tersimpan, harus dikompilasi ulang. Untuk informasi lebih lanjut, lihat Mengkompilasi Ulang Prosedur yang Disimpan. RECOMPILE juga berguna saat Anda membuat panduan paket. Untuk informasi lebih lanjut, lihat Mengoptimalkan Permintaan di Aplikasi yang Disebarkan dengan Menggunakan Panduan Paket.
Karena kueri saya memiliki banyak variabel lokal, tebakan saya adalah SQL Server dapat (serius) mengoptimalkannya ketika saya menggunakan OPTION (RECOMPILE)
petunjuk kueri.
Di mana-mana saya melihat orang mengatakan bahwa itu OPTION (RECOMPILE)
harus dihindari. Penjelasan untuk ini secara umum adalah bahwa menggunakan petunjuk ini SQL Server tidak dapat menggunakan kembali rencana exection ini dan oleh karena itu harus membuang waktu mengkompilasi ulang setiap kali.
(Tapi) Mengingat keunggulan kinerja yang sangat besar, saya cenderung berpikir bahwa menggunakan petunjuk permintaan ini kali ini akan menjadi hal yang baik.
Haruskah saya menggunakannya? Jika tidak, adakah cara saya bisa memaksa SQL Server untuk menggunakan rencana eksekusi yang lebih baik tanpa petunjuk ini dan tanpa mengubah aplikasi?