Trace Flag 4199 - Mengaktifkan secara global?

19

Ini mungkin termasuk dalam kategori opini, tapi saya penasaran jika orang menggunakan jejak flag 4199 sebagai parameter startup untuk SQL Server. Bagi mereka yang telah menggunakannya, dalam kondisi apa Anda mengalami regresi kueri?

Ini jelas tampak seperti manfaat kinerja potensial di seluruh lini, saya mempertimbangkan untuk memungkinkannya secara global di lingkungan non-produksi kami dan membiarkannya duduk selama beberapa bulan untuk menemukan masalah apa pun.

Apakah perbaikan pada 4199 dimasukkan ke pengoptimal secara default pada 2014 (atau 2016)? Meskipun saya memahami alasan untuk tidak memperkenalkan perubahan rencana yang tidak terduga, tampaknya aneh untuk menjaga semua perbaikan ini disembunyikan di antara versi.

Kami menggunakan 2008, 2008R2 dan sebagian besar 2012.

FilamentUnities
sumber
Apakah Anda saat ini mengalami masalah perkiraan kardinalitas atau sesuatu?
Zane
Sudahkah Anda membaca perubahan yang diaktifkan oleh bendera untuk melihat apakah itu bermanfaat bagi Anda?
swasheck
Saya telah membaca semuanya, beberapa tampaknya relevan, banyak kolom yang bergabung.
FilamentUnities

Jawaban:

20

Secara pribadi, setiap kali saya membangun server baru untuk proyek baru, saya selalu mengaktifkan TF4199 secara global. Hal yang sama berlaku ketika saya meningkatkan instans yang ada ke versi yang lebih baru.

TF memungkinkan perbaikan baru yang akan mempengaruhi perilaku aplikasi, tetapi untuk proyek-proyek baru risiko regresi bukan masalah. Untuk instance yang ditingkatkan dari versi sebelumnya, perbedaan antara versi lama dan baru menjadi perhatian mereka sendiri dan harus berurusan dengan regresi rencana yang diharapkan, jadi saya lebih suka berjuang dengannya dengan TF4199 diaktifkan.

Sejauh menyangkut basis data yang ada, hanya ada satu cara untuk mengetahuinya: mengujinya. Anda dapat menangkap beban kerja pada pengaturan yang ada dan memutar ulang setelah mengaktifkan bendera. Utilitas RML dapat membantu Anda mengotomatiskan proses, seperti yang dijelaskan dalam jawaban ini .

Jelas, flag mempengaruhi seluruh instance, jadi Anda harus menguji semua database yang duduk di sana.

spaghettidba
sumber
12
Juga penting untuk dicatat bahwa semua perbaikan 4199 hingga saat ini akan dihidupkan di SQL Server 2016 (tanpa tanda jejak). 4199 masih akan berfungsi, tetapi hanya akan mengaktifkan perbaikan baru sejak saat itu.
Aaron Bertrand
6

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.

Greg
sumber
1

Saya ingin berbagi pengalaman dengan jejak bendera 4199.

Saya baru saja selesai mendiagnosis masalah kinerja pada sistem pelanggan yang menjalankan SQL Server 2012 SP3. Pelanggan memindahkan database pelaporan dari server OLTP produksi mereka ke server baru. Tujuan pelanggan adalah menghapus persaingan untuk sumber daya dengan kueri OLTP. Sayangnya, pelanggan mengatakan server pelaporan baru sangat lambat.

Kueri sampel dijalankan pada sistem OLTP selesai dalam 1,6 detik. Rencana kueri melakukan pencarian indeks pada tabel baris ~ 200 juta yang merupakan bagian dari tampilan.

Di server baru, permintaan yang sama selesai dalam 10 menit 44 detik. Itu melakukan pemindaian indeks pada tabel baris ~ 200 juta yang sama.

Data server pelaporan adalah salinan data OLTP, jadi sepertinya tidak ada perbedaan dalam data.

Saya bingung sampai saya ingat bahwa perangkat lunak kami (yang menjalankan sistem OLTP mereka) mengaktifkan beberapa tanda jejak saat startup. Salah satunya, 4199, yang saya ingat adalah perbaikan pengoptimal kueri.

Saya menguji memungkinkan jejak bendera 4199 pada server pelaporan baru pelanggan, dan permintaan pelaporan selesai dalam 0,6 detik. (Wow!) Saya menonaktifkan tanda jejak, dan permintaan kembali selesai dalam 10 menit 44 detik. Mengaktifkan bendera: kembali ke 0,6 detik. Rupanya, mengaktifkan tanda jejak memungkinkan pengoptimal menggunakan pencarian indeks ke tampilan pada tabel 200 juta baris.

Dalam hal ini, optimasi kueri yang diaktifkan oleh trace flag 4199 membuat perbedaan yang sangat besar. Pengalaman Anda mungkin beragam. Namun, berdasarkan pengalaman ini, sepertinya layak untuk saya.

Paul Williams
sumber