Konu ile ilgili aramam beni buraya getirdi, bu yüzden sadece konu hakkındaki son deneyimlerimi paylaşmak istiyorum.
SQL 2014 çalıştırıyordum, bu yüzden 4199'u biraz önemsememenin güvenli olacağını düşündüm ... ama bu doğru değildi ...
4199'a ihtiyacınız varsa Teşhis Nasıl Yapılır
Senin Eğer sorgu çalıştırmak için görünür kötü bunu, o zaman tüm sorunlarını giderir eğer gerekebilir olarak da bakınız bunun sonuna aşağıdaki eklemeyi deneyin olmamalıdır hissettiklerinde özellikle 4199 ( "Tüm Sorgu Doktoru düzeltmeleri etkinleştirin." )
SELECT SomeColumn
FROM SomeTable
OPTION(QUERYTRACEON 4199)
Benim durumumda, iyi olmayan bir sorguyu havaya uçuran ilk 10 fıkra vardı, bu da balıklı bir şeyin olduğunu düşünmemi sağladı ve 4199 bu konuda yardımcı olabilir.
4199 hakkında
Yeni ana sürüm sürümünden sonra oluşturulan tüm SQL Server Query Optimizer hata / performans düzeltmeleri gizlenir ve engellenir. Bu, teorik olarak mükemmel bir şekilde optimize edilmiş başka bir programa gerçekten zarar verebilecekleri durumdur. Bu nedenle, güncellemeleri olabildiğince yükleyin, gerçek sorgu iyileştirici değişiklikleri varsayılan olarak etkin değildir. Bu nedenle, tek bir düzeltme veya geliştirme yapıldıktan sonra, yararlanmak istiyorsanız 4199 bir zorunluluk haline gelir. Birçok düzeltme göründüğü için, sonunda sizi bunlardan biri sizi etkilediğinde bu durumu açtığınızda bulacaksınız. Bu düzeltmeler genellikle kendi izleme bayraklarına bağlıdır, ancak 4199 "Her düzeltmeyi aç" ana yöneticisi olarak kullanılır.
Hangi düzeltmelere ihtiyacınız olduğunu biliyorsanız, 4199 kullanmak yerine bunları parça yemeği etkinleştirebilirsiniz. Tüm düzeltmeleri etkinleştirmek istiyorsanız 4199 kullanın.
Tamam, yani 4199'u küresel olarak istiyorsun ...
Sadece izleme bayrağı genel olarak etkinleştirmek için aşağıdaki satır ile her sabah çalışan bir SQL Agent işi oluşturun. Bu, herhangi birinin onları kapatıp kapatmamasını, tekrar açılmasını sağlar. Bu iş adımı oldukça basit bir sql'ye sahiptir:
DBCC TRACEON (4199, -1);
Burada -1, DBCC TRACEON içindeki Global bölümü belirtir. Daha fazla bilgi için:
https://msdn.microsoft.com/en-us/library/ms187329.aspx?f=255&MSPPError=-2147217396
"Yeniden Derleme" Sorgu Planları
En son denememde küresel olarak 4199'u etkinleştirmem ve ardından mevcut önbelleğe alınmış sorgu planlarını kaldırmam gerekiyordu :
sp_recompile 'dbo.SomeTable'
https://msdn.microsoft.com/en-us/library/ms181647.aspx?f=255&MSPPError=-2147217396
Depolanan yeniden derleme yordamı, veritabanı nesnesiyle (tablo gibi) ilgili herhangi bir sorgu planını bulur ve bu sorgu planlarını siler; bir sonraki derleme, bunları derlemek için benzer bir sorgu çalıştırmayı gerektirir.
Yani, benim durumumda 4199 kötü sorgu planlarının oluşturulmasını engelledi, ama yine de sp_recompile ile önbelleğe alınmış olanları kaldırmak zorunda kaldım. Etkilenen bilinen sorgudan herhangi bir tablo seçin ve şimdi 4199'u global olarak etkinleştirdiğinizi ve rahatsız edici önbelleğe alınmış sorgu planını temizlediğinizi varsayarak bu sorguyu tekrar denemekte fayda vardır.
4199 Sonuç olarak
Dizinleri kullandıkça, bu dizinleri akıllı bir şekilde kullanmak için akıllı bir sorgu planı optimizasyonu önemli hale gelir ve zaman içinde sorgu optimizasyon sürecine yönelik bazı düzeltmelerin yayınlanacağını varsayarsak, genel olarak 4199 ile etkin şekilde çalıştırılabilecek güvenli su içindeyseniz, bazı yeni düzeltmelerin, söz konusu düzeltmeden önce önceki ortamda bu kadar optimize edilmiş yüksek düzeyde optimize edilmiş bir veritabanı ile gerçekten iyi çalışmayabileceğini fark ettiğiniz sürece. Peki 4199 ne yapar? Sadece tüm düzeltmeleri etkinleştirir.