İzleme Bayrağı 4199 - Genel olarak etkinleştirilsin mi?


19

Bu görüş kategorisine girebilir, ancak insanların izleme bayrağı 4199 SQL Server için bir başlangıç ​​parametresi olarak kullanıp kullanmadığını merak ediyorum . Bunu kullananlar için hangi koşullar altında sorgu gerilemesi yaşadınız?

Kesinlikle yönetim kurulu genelinde potansiyel bir performans faydası gibi görünüyor, üretim dışı ortamımızda küresel olarak etkinleştirmeyi ve herhangi bir sorunu ortaya çıkarmak için birkaç ay oturmasına izin vermeyi düşünüyorum.

4199'daki düzeltmeler 2014'te (veya 2016) varsayılan olarak optimize ediciye getirildi mi? Beklenmedik plan değişiklikleri getirmediğimi anlasam da, tüm bu düzeltmeleri sürümler arasında gizli tutmak tuhaf görünüyor.

2008, 2008R2 ve çoğunlukla 2012 kullanıyoruz.


Şu anda kardinalite tahmini sorunları veya benzeri bir şey mi yaşıyorsunuz?
Zane

Size yarar sağlayıp sağlamadığını görmek için bayrağın etkinleştirdiği değişiklikleri okudunuz mu?
swasheck

Bunları okudum, özellikle alakalı, çok sütunlu birleşimler gibi görünüyor.
FilamentUnities

Yanıtlar:


20

Şahsen, yeni bir proje için yeni bir sunucu kurduğumda her zaman küresel olarak TF4199'u etkinleştiriyorum. Aynı durum, mevcut örnekleri daha yeni sürümlere yükselttiğimde de geçerlidir.

TF, uygulamanın davranışını etkileyecek yeni düzeltmeler yapılmasını sağlar, ancak yeni projeler için regresyon riski bir sorun değildir. Önceki sürümlerden yükseltilen örneklerde, eski ve yeni sürüm arasındaki farklar kendi başlarına bir endişe kaynağıdır ve yine de plan gerilemesi ile uğraşmak zorunda kalmanız beklenmektedir, bu yüzden TF4199 etkinken onunla savaşmayı tercih ediyorum.

Mevcut veritabanları söz konusu olduğunda, bilmenin tek bir yolu vardır: test edin. Mevcut kurulumda bir iş yükünü yakalayabilir ve bayrağı etkinleştirdikten sonra yeniden yükleyebilirsiniz. RML Yardımcı Programları, bu cevapta açıklandığı gibi işlemi otomatikleştirmenize yardımcı olabilir .

Açıkçası, bayrak tüm örneği etkiler, bu yüzden orada oturan tüm veritabanlarını test etmeniz gerekir.


12
Ayrıca bugüne kadar tüm 4199 düzeltmelerinin SQL Server 2016'da (izleme bayrağı olmadan) açılacağını unutmayın. 4199 yine de çalışır, ancak yalnızca bu noktadan sonra yeni düzeltmeleri etkinleştirir.
Aaron Bertrand

6

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.


1

Deneyimlerimi 4199 izleme bayrağıyla paylaşmak istedim.

SQL Server 2012 SP3 çalıştıran bir müşteri sisteminde performans sorunu tanılamayı yeni bitirdim. Müşteri bir raporlama veritabanını üretim OLTP sunucusundan yeni bir sunucuya taşıyordu. Müşterinin hedefi, OLTP sorgularıyla kaynaklar için rekabeti kaldırmaktı. Ne yazık ki, müşteri yeni raporlama sunucusunun çok yavaş olduğunu söyledi.

OLTP sisteminde çalıştırılan örnek sorgu 1.6 saniyede tamamlandı. Sorgu planı, görünümün bir parçası olan ~ 200 milyon satırlık bir tabloda bir dizin araması yaptı.

Yeni sunucuda aynı sorgu 10 dakika 44 saniyede tamamlandı. Aynı ~ 200 milyon satırlık tabloda bir dizin taraması gerçekleştirdi.

Raporlama sunucusu verileri OLTP verilerinin bir kopyasıydı, bu nedenle verilerde bir fark görünmüyordu.

Yazılımımızın (OLTP sistemini çalıştıran) başlangıçta bazı izleme bayraklarını etkinleştirdiğini hatırlayana kadar güldüm. Bunlardan biri, 4199, bir sorgu iyileştirici düzeltme olduğunu hatırladım.

Müşterinin yeni raporlama sunucusunda izleme bayrağını 4199 etkinleştirmeyi test ettim ve raporlama sorgusu 0,6 saniyede tamamlandı. (Vay canına!) İzleme bayrağını devre dışı bıraktım ve sorgu 10 dakika 44 saniye içinde tamamlandı. Bayrağı etkinleştirdi: 0,6 saniyeye geri dön. Görünüşe göre, izleme işaretinin etkinleştirilmesi, optimize edicinin 200 milyon satır tablosundaki görünüme bir dizin araması kullanmasını sağladı.

Bu durumda, izleme bayrağı 4199 tarafından etkinleştirilen sorgu optimizasyonları büyük bir fark yarattı. Deneyimleriniz değişebilir. Ancak, bu deneyime dayanarak, kesinlikle bana izin vermeye değer görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.