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.
- 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?
- 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 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.