Olağan Şüpheliler:
- adhoc sabitleri, kod parametreleri
- koddaki veri türlerinin uyumsuzluğu
- parametre koklama
Nokta 1: iyileştirici sabitler için en iyi planı seçebilir.
Sabitleri değiştir = planı değiştir. Parametreli bir plen resuable
Nokta 2 veri türü önceliği nedeniyle örtük dönüşümler getirecektir,
örneğin nvarchar parametresine kıyasla varchar sütunu
Nokta 3: parametre maskeleme kullanın veya BİLİNMEYENLER İÇİN OPTİMİZE EDİNİN
Düzenle: Test etmek için: saklanan proc'u çalıştırın, sp_updatestats'ı çalıştırın, tekrar çalıştırın. Bu, önbellek planlarını geçersiz kılacaktır; bu, plan önbelleğini temizlemekten daha iyidir
Edit: jcolebrand'ın yorumundan sonra
Koklamayı birkaç şekilde devre dışı bırakabilirsiniz. Ana 3
- RECOMPILE. Bu aptalca IMO.
- BİLİNMEYENLER İÇİN OPTİMİZE EDİN
- Parametre maskeleme
Parametre maskeleme:
DECLARE @MaskedParam varchar(10)
SELECT @MaskedParam = @SignaureParam
SELECT...WHERE column = @MaskedParam
Maskeleme ve OPTIMIZE ipucu aynı etkiye sahiptir (belki farklı nedenlerle). Yani, optimize edici istatistik ve veri dağıtımını kullanmak zorundadır ( Not: Mark Storey-Smith tarafından test altındadır ) parametreleri kendi değerlerine göre değerlendirir mi? son çağrıdan çok. Optimize edici yeniden derlenebilir veya olmayabilir. SQL Server 2005, daha az etki olması için deyim düzeyi yeniden derlemesi ekledi
Şimdi, neden "sniffed" parametreleri ile bir plan "yapışkan" maskeli / "bilinmeyen" parametreleri ile karşılaştırıldığında, emin değilim.
SQL Server 2000'den bu yana en basit kod hariç tüm parametre maskelemesini kullandım. Ben daha karmaşık kod ile gerçekleşmek sorumlu olduğunu kaydetti. Ve eski işimde plan parametresi varsayılanlarını değiştirebileceğim bazı raporlar var. "Kargo kült" yaklaşımının bir destek çağrısından daha kolay olduğunu düşünüyorum.
Düzenle 2, 12 Eki 2011, biraz sohbet ettikten sonra
Parametre maskeleme ve BİLİNMEYENLER İÇİN OPTİMİZE ET, söyleyebildiğim kadarıyla aynı etkiye sahiptir
İpucu ipucu maskelemeden daha temizdir ancak SQL Server 2008 ile eklenmiştir.
Parametre koklaması derleme zamanında gerçekleşir.
RECOMPILE İLE her yürütme yeni bir plan oluşturur. Bu, düşük bir varsayılan seçimin planı etkileyeceği anlamına gelir. Son işimde, bunu bazı rapor kodlarıyla kolayca gösterebilirim: parametre varsayılanlarını değiştirmek, sağlanan parametrelerden bağımsız olarak planı değiştirdi.
Bu MS Connect makalesi ilginç: Saklı yordam içinde yetersiz dizin kullanımı (aşağıdaki SO yanıtlarından birinde belirtilmiştir)
- Bob Beauchemin de bundan bahsediyor
Öne çıkan sorunlar
RECOMPILE İLE koklama hala geçerli mi? Yani, eğer optimizer planı atmayı biliyorsa, yeniden kullanımı mı hedefliyor?
Koklanan planlar neden "yapışkan"?
SO'dan bağlantılar:
WHERE
cümlesindeki bir değişkene başvuruyor mu?