IF'yi T-SQL'de kullanmak, yürütme planı önbelleğe almayı zayıflatır veya keser mi?


20

Bana, t-SQL partilerinde IF ifadelerinin kullanılmasının performans için zararlı olduğu öne sürülmüştür. Biraz onay bulmaya veya bu iddiayı doğrulamaya çalışıyorum. SQL Server 2005 ve 2008 kullanıyorum.

İddia şu parti ile: -

IF @parameter = 0
 BEGIN
  SELECT ... something
 END

ELSE
 BEGIN
  SELECT ... something else
 END

SQL Server, oluşturulan yürütme planını yeniden kullanamaz çünkü bir sonraki yürütme farklı bir dal gerektirebilir. Bu, SQL Server'ın şu anki yürütme için hangi şubenin gerekli olduğunu önceden belirleyebileceği temelinde yürütme planından bir dalı tamamen ortadan kaldıracağı anlamına gelir. Bu gerçekten doğru mu?

Ayrıca bu durumda ne olur: -

IF EXISTS (SELECT ....)
 BEGIN
  SELECT ... something
 END

ELSE
 BEGIN
  SELECT ... something else
 END

hangi şubenin önceden yürütüleceğini belirlemek mümkün değilse?



1
SQL Server, dalları değil, yalnızca dallarda yer alan ifadeleri dikkate aldığından yürütme planını yeniden kullanabilir ve yeniden kullanır.
MartinC

Yanıtlar:


10

SQL Server, saklı yordam içindeki koşullu dalları yoksayarak saklı yordam için sorgu planı derleme işlemini en iyi duruma getirir. Plan, ilk yürütme için kullanılan parametrelere dayalı olarak oluşturulacak, bu, parametreler dallar için farklıysa sorunlara neden olacaktır.

Her bir dal için SQL kendi saklı yordam içine yerleştirirsiniz, böylece oluşturulan plan bu dal için parametrelerin gerçek kullanımına dayanır.


6

Tek kısayol IF 1 = 1

Hem @parameter hem de EXISTS hala "genel durum" için işlem yapılmasını gerektirir ( @parameter = 42diyelim)

Bunu söyleyerek ... gerçek yürütme planı ne de yeniden tamamlama olaylarını yakalayan profilcinin ne diyor ? (Jao'nun cevabına göre tahmini planları sevmiyorum)


3

Tahmini yürütme planını görüntülemeye çalışın, gerçek değil. Birincisinin CONDoperatör içerdiğini göreceksiniz .

Bu operatör de önbelleğe alınmış yürütme planına dahil edildi. Örneğinizde, tahmini hariç tutma planı bir COND operatörü ve 2 SELECT dalı içerecektir ve bu nedenle tamamen yeniden kullanılabilir olacaktır. Çünkü bir toplu iş yürütürken SQL Server sadece DML deyimlerini değil, diğer tüm değerlendirir, bunları plandan elde.

Dahili yürütme planı, ifade ağacına benzer bir yapıdır.


0

Planlar geçirilen parametrelere dayalı olarak oluşturulacaktır, bu yüzden gerçekte Hayır diyorum - normalde parametrelere dayanan koşullu mantığa sahip olmak performans için zararlı değildir.

Parametrelerin, sorgu optimize edicisinin fark etmesi için yeterince varyansa neden olduğu varsayılarak, birden fazla plan üretilir.

Hangisini Yürütmeyi Göster planını açarak, komut dosyalarını çalıştırarak görebilirsiniz - plandaki farklara dikkat edin. Prosedürleri çalıştırdığınızda (burada saklı prosedürleri varsayıyorum), ilk seferin genellikle daha hızlı olduğunu, ikinci isabetin saklanan planı kullandığını göreceksiniz. Parametreleri değiştirin ve tekrarlayın ve orijinal parametreleri çalıştırın - teorik olarak plan hala önbellekte olacak, ancak sunucu kullanımına bağlıdır (önbellek keneleri - sonsuza kadar kalmaz ..) vb.


0

Belki 2005 ve 2008'de geliştirildi, ancak 2000'de koşulların kullanılması sizin tanımladığınızdan daha kötü olurdu, prosedürün ilk çalışmasını en iyi şekilde ele almak için bir plan derleyecek ve daha sonra koşullar bile prosedürü yürütmek için bu planı kullanacaktır. değişti. Deneyimlerime göre bu, dakikalar içinde çalışan sorguların saatlerce çalışmasına neden oldu. 2008'i şimdi kullandığım ve 2005'i kullandığım halde, koşulların orada nasıl çalıştığı hakkında yorum yapamam çünkü artık onları kullanmıyorum.


2
2005+ deyim düzeyi yeniden derlemesi var, böylece "sp başına bir planın" artık yok
gbn
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.