SEÇENEK KUVVET SİPARİŞİ satırlar silinene kadar performansı artırır


9

Ben gerektiği gibi performans değildi biraz karmaşık bir SQL Server 2008 sorgu (yaklaşık 200 satır oldukça yoğun SQL) var. Zamanla, performans yaklaşık 5 saniyeden yaklaşık 2 saniyeye düştü.

Yürütme planına bakıldığında, birleşimleri yeniden düzenleyerek performansın iyileştirilebileceği oldukça açıktı. Yaptım, ve yaptı ... yaklaşık .3 saniye. Şimdi sorgu "SEÇENEK KUVVET SİPARİŞ" ipucu vardır ve hayat iyidir.

Bugün bana geliyor, veritabanını temizliyor. Satırların yaklaşık% 20'sini arşivlerim, satırları silmek dışında ilgili veritabanında herhangi bir işlem yapmam ... yürütme planı TAMAMEN ev sahipliği yapar . Belirli alt ağaçların kaç satır döndüreceğini tamamen yanlış değerlendirir ve (örneğin) aşağıdakilerin yerine geçer:

<Hash>

ile

<NestedLoops Optimized='false' WithUnorderedPrefetch='true'>

Şimdi sorgu süresi yaklaşık .3s'den 18s'e yükselir. (!) Sadece satırları sildiğim için. Sorgu ipucunu kaldırırsam, yaklaşık 2s sorgu zamanına geri döndüm. Daha iyi, ama daha kötü.

Veritabanını birden çok konuma ve sunucuya geri yükledikten sonra sorunu yeniden oluşturdum. Her tablodaki satırların yaklaşık% 20'sini silmek her zaman bu soruna neden olur.

  1. Zorunlu birleştirme siparişinin, sorgu tahminlerinin tamamen yanlış olmasını (ve dolayısıyla sorgu sürelerinin öngörülemez olmasını) sağlaması normal midir?
  2. Sadece en uygun olmayan sorgu performansını kabul etmem veya bir şahin gibi izlemem ve sık sık elle sorgu ipuçlarını düzenlemem gerekecek mi? Ya da belki de her bir katılımı ipucu? .3s ila 2s arasında büyük bir hit.
  3. Optimize edicinin satırları sildikten sonra neden patladığı açık mı? Örneğin, "evet, örnek bir tarama aldı ve veri geçmişinin önceki satırlarının çoğunu arşivlediğim için, örnek seyrek sonuçlar verdi, bu yüzden sıralı bir karma işlem ihtiyacını hafife aldım"?

Yürütme planlarını görmek istiyorsanız, lütfen bunları gönderebileceğim bir konum önerin. Aksi takdirde, en çarpıcı parçayı örnekledim. İşte temel yanlış tahmin, parenlerdeki sayılar (tahmini: gerçek) satırlardır.

                             /  Clustered Index Scan (908:7229)
Nested Loops (Inner Join) --<
                             \  NonClustered Index Seek (1:7229)

İç döngünün 908 satırı taraması beklenir, ancak bunun yerine 52.258.441'i tarar. Doğru olsaydı, bu dal 12 saniye yerine yaklaşık 2 ms koşardı. Satırları silmeden önce, bu iç birleşim tahmini yalnızca toplam 2 faktör tarafından kapatıldı ve iki kümelenmiş dizin üzerinde bir karma eşleşme olarak gerçekleştirildi.

Yanıtlar:


6

Zorunlu birleştirme siparişinin, sorgu tahminlerinin tamamen yanlış olmasını (ve dolayısıyla sorgu sürelerinin öngörülemez olmasını) sağlaması normal midir?

KUVVET SİPARİŞİ kullanımı tahminleri yanlış yapmıyor, satırların silinmesi. İstatistikleri tabloya güncellemeye zorlamak tahmin doğruluğunu artırabilir.

Sadece en uygun olmayan sorgu performansını kabul etmem veya bir şahin gibi izlemem ve sık sık elle sorgu ipuçlarını düzenlemem gerekecek mi? Ya da belki de her bir katılımı ipucu? .3s ila 2s arasında büyük bir hit.

Optimize ediciye, KUVVET SİPARİŞİ ipucunu kullanmadan en iyi planı oluşturmak için ihtiyaç duyulan bilgilerin verilmesini sağlamak tercih edilir. Bunu yaparak, manuel müdahale gerektirmeden temel veri dağıtımındaki değişikliklerle daha iyi başa çıkmalıdır . Bununla birlikte, verilerin niteliği, kardinalite saat veya saat saat önemli ölçüde değişebilecek şekildeyse , planın düzeltildiğinden emin olmak için bir plan kılavuzu kullanmayı düşünün .

Optimize edicinin satırları sildikten sonra neden patladığı açık mı? Örneğin, "evet, örnek bir tarama aldı ve veri geçmişinin önceki satırlarının çoğunu arşivlediğim için, örnek seyrek sonuçlar verdi, bu yüzden sıralı bir karma işlem ihtiyacını hafife aldım"?

Sorun tablolarında satır sayılarından bahsetmediniz, ancak silme işlemlerinin ya

  • bir istatistik güncellemesini tetikleyecek kadar satır kaldırmadı. Bu, satırların% 20'si değiştirildiğinde, dinamik bir eşik sağlamak için izleme bayrağı 2371 kullanma seçeneği olduğunda gerçekleşmelidir .
  • bir istatistik güncellemesini tetikledi ancak toplanan örnek temsili değildi. FULLSCAN İLE manuel bir güncelleme çalıştırarak bunu düzeltin .

Ayrıca , etrafta çalışmak için sayısız seçenek olan iyi eski moda parametre koklama problemleri ile karşılaşıyor olabilirsiniz. RECOMPILE İLE bu büyük bir sorgu ile belirtmek pahalı bir seçenek olabilir, ancak hem prosedür hem de ifade düzeyinde araştırmaya değer.


Sadece bir açıklama, muhtemelen anlambilim: "KUVVET SİPARİŞİ kullanımı tahminleri yanlış yapmıyor, satırların silinmesi yaptı." Yani "KUVVET SİPARİŞİ" kaldırmanın sorguyu çok geliştirdiğini sadece rastgele bir şans olduğunu düşünüyorsunuz? İpucu, optimize ediciyi daha az vurgulanacak istatistiklere dayanmaya itmedi veya uygulama testinde keşfedilmedi, çünkü bu daha az güvenilir istatistik nadiren önemliydi?
shannon

Bence evet, iyimserlerin tercih ettiği plan seçiminin yanlış istatistiklerle başa çıkması, ancak katılma emrinin zorlanmasıyla sonuçlanan planın olmaması. İstatistik değerlendirmesinde herhangi bir değişikliğe neden olan KUVVET SİPARİŞİNİN farkında değilim, aksi takdirde herhangi bir şey biliyorlarsa başka biri araya girecektir. Ayrıca OPTIMIZE FOR için seçtiğiniz değerin uygun olup olmadığını da dikkate almanız gerekir. İstatistikler kesinlikle iyi olabilir, ancak temsili olmayan bir değere dayanan bir planı zorluyorsunuz.
Mark Storey-Smith

Sağ. Parametreleri tam olarak optimize ettiğim gibi geçirirken aynı performans sorunum var. Tekrar teşekkürler.
shannon
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.