Pencarian saya pada topik membawa saya ke sini, jadi saya hanya ingin berbagi pengalaman saya baru-baru ini tentang topik tersebut.
Saya menjalankan SQL 2014, jadi saya pikir saya akan aman dari harus peduli sedikit untuk 4199 ... tapi itu tidak benar ...
Cara Mendiagnosis jika Anda membutuhkan 4199
Jika kueri Anda tampaknya berjalan buruk , terutama ketika Anda merasa tidak seharusnya, maka coba tambahkan berikut ini di akhir juga lihat apakah itu memperbaiki semua masalah Anda, karena Anda mungkin perlu 4199 ("Aktifkan semua perbaikan Pengoptimal Permintaan." )
SELECT SomeColumn
FROM SomeTable
OPTION(QUERYTRACEON 4199)
Dalam situasi saya, saya memiliki 10 klausa teratas yang meledakkan kueri yang berjalan dengan baik tanpa, yang membuat saya berpikir sesuatu yang mencurigakan sedang terjadi, dan bahwa 4199 mungkin membantu.
Tentang 4199
Perbaikan bug / kinerja SQL Server Query Optimizer yang dibuat setelah rilis versi utama baru benar-benar disembunyikan dan diblokir. Ini kalau-kalau mereka mungkin benar-benar membahayakan beberapa program lain yang dioptimalkan secara teoritis sempurna. Jadi, instal pembaruan sebanyak mungkin, perubahan pengoptimal permintaan yang sebenarnya tidak diaktifkan secara default. Oleh karena itu, setelah perbaikan atau peningkatan tunggal dilakukan, 4199 menjadi keharusan jika Anda ingin memanfaatkannya. Saat banyak perbaikan muncul, Anda akhirnya akan mengaktifkannya ketika salah satu dari mereka memengaruhi Anda. Perbaikan ini biasanya terkait dengan bendera jejak mereka sendiri, tetapi 4199 digunakan sebagai master "Nyalakan setiap perbaikan."
Jika Anda tahu perbaikan mana yang Anda butuhkan, Anda bisa mengaktifkannya sepotong-sepotong alih-alih menggunakan 4199. Jika Anda ingin mengaktifkan semua perbaikan, gunakan 4199.
Oke, Jadi Anda ingin 4199 secara global ...
Cukup Buat Pekerjaan Agen SQL yang berjalan setiap pagi dengan baris berikut untuk mengaktifkan tanda jejak secara global. Ini memastikan jika ada yang mematikannya, dll., Bahwa mereka dihidupkan kembali. Langkah kerja ini memiliki sql yang cukup sederhana:
DBCC TRACEON (4199, -1);
Di mana -1 menentukan bagian Global di DBCC TRACEON. Untuk info lebih lanjut, lihat:
https://msdn.microsoft.com/en-us/library/ms187329.aspx?f=255&MSPPError=-2147217396
Rencana Kueri "Kompilasi Ulang"
Dalam upaya terbaru saya, saya harus mengaktifkan 4199 secara global, dan kemudian juga menghapus paket permintaan cache yang ada :
sp_recompile 'dbo.SomeTable'
https://msdn.microsoft.com/en-us/library/ms181647.aspx?f=255&MSPPError=-2147217396
Di mana prosedur kompilasi yang tersimpan menemukan rencana kueri yang berkaitan dengan objek database (seperti tabel) dan menghapus rencana kueri tersebut, memerlukan upaya berikutnya untuk menjalankan kueri yang sama untuk mengkompilasi mereka.
Jadi, dalam kasus saya 4199 membuat rencana kueri yang buruk tidak dibuat, tetapi saya juga harus menghapus yang masih di-cache melalui sp_recompile. Pilih tabel mana saja dari kueri yang diketahui terkena dan Anda harus mencoba kueri itu lagi, dengan asumsi Anda sekarang telah mengaktifkan 4199 secara global dan menghapus rencana kueri cache yang menyinggung.
Kesimpulannya pada 4199
Saat Anda menggunakan indeks, optimisasi rencana kueri pintar menjadi penting untuk benar-benar menggunakan indeks tersebut secara cerdas, dan dengan asumsi bahwa seiring waktu beberapa perbaikan pada proses optimasi kueri akan dirilis, Anda biasanya berada dalam air yang aman untuk hanya menjalankan 4199 yang diaktifkan secara global, selama Anda menyadari bahwa beberapa perbaikan baru mungkin tidak benar-benar bermain sebaik dengan database yang sangat optimal yang telah dioptimalkan di lingkungan sebelumnya sebelum perbaikan tersebut. Tapi apa yang dilakukan 4199? Itu hanya memungkinkan semua perbaikan.