2013-03-15 25 views
6

Dinamik bir SQL parçam var. Koşmak yaklaşık 4 dakika sürüyor. Bunun yerine SQL'in çıktısını alıp bunu çalıştırırsam yaklaşık 20 saniye sürer. Neden uyuşmazlık? Dinamik sürümde SQL'in oluşturulmasının biraz zaman alacağını biliyorum, ancak bunun pahalı olduğunu düşünemiyorum.Dinamik SQL sabit kodlanmış eşdeğerden çok daha uzun sürüyor

Herhangi bir fikri olan var mı? İki sorgu aynı olmalı, sorgulama önbelleği ile garip bir şey olduğundan şüpheleniyordum, ama gerçekten bir fikri yok.

Düzenleme: Çıktının alınmasıyla neyi kastettiğimi açıklığa kavuşturmak.

dinamik SQL son satırı Ben MyQuery değerini aldı ve kendi SQL dosyaya koydu

EXEC sp_executesql @myQuery, 
    N'@var1 INT, 
    @var2 INT, 
    @var2 INT', 
    @var1, 
    @var2, 
    @var3 

olduğunu. Bu, yürütmeyi kullanan dinamik olanı 4 saniyede alırken 20 saniyede çalışıyor.

Düzen 2 Parametreleri kaldırdım. İlginç sonuçlar aldım. Dinamik SQL deyimi bir performans iyileştirmesi gördü. Hardcoded sürümü büyük bir performans isabeti gördü. İkisi şimdi yaklaşık eşittir.

+9

Lütfen kodunuzu gönderin. – Taryn

+0

Kodunuzu gösterebilir misiniz? –

+0

Daha fazla bilgi eklemelisiniz, ancak eğer daha hızlı kodlanmışsa, kesinlikle yanlış bir şey yapıyorsunuz demektir. – TFennis

cevap

6

Microsoft SQL Server kullandığınızı varsayacağım (yalnızca "sql" sorunuzu etiketlediniz).

Farklı parametre değerlerinin farklı bir en iyileştirme planıyla sonuçlanabileceği bazı durumlar vardır. Sonra bu optimizasyon planı önbelleğe alınır ve bir sonraki sorgulamada farklı parametre değerleriyle çalıştırılır. Ancak optimizasyon planı, sonraki parametre değerleri için en iyi plan değildir. parameterization olmadan aynı sorguyu çalıştıran göre kötü performansa neden olabilir bir parametreli sorgu kullanarak bazı durumlar vardır - https://www.simple-talk.com/sql/t-sql-programming/parameter-sniffing/

Yani evet:

İşte bu sorunu ve bazı çözümler hakkında bir makale.

Sizin kodunuzda özgürlüğünüz yoksa, bunun sizin için geçerli olup olmadığını bilemeyiz.

Bunu yapamayacağınıza saygı duyarım - StackOverflow, you implicitly license your code and/or words with a Creative Commons license'a göndererek. Ancak, kabul etmedikçe, işvereninizin sahip olduğu kodu paylaşmanız uygun olmaz.

+0

OP, karşı problemi yaşıyor; Parametreleme ile sorgulama, parametreleme ile sorgudan çok daha yavaş çalışır. –

+0

@PieterGeerkens, OP'nin açıklanan problemini böyle okumuş değilim. –

+0

Her iki parametrelendirme, farklı sorgu planlarına neden olabilir. Ve farklı sorgu planları farklı çalışma sürelerine neden olacaktır. –

4

SQL Server 2008 veya sonrası kullanıyorsanız, BİLİNMEYEN sorgu ipucu iyi duruma GETIRMEK kullanın:

Ne parametre koklama olduğunu açıklayan burada bir makale vardır. Dinamik sorgunun sonuna aşağıdaki ekleyin:

OPTION (OPTIMIZE FOR (@var1 UNKNOWN, @var2 UNKNOWN, @var3 UNKNOWN)) 

Experiment veya üç girdiler @ var1, @ var2 ve @ var3 dışarı değişen. Evet, sorgu iyileştiricisi gerçekten ad hoc olan bir şey üzerinde istatistikleri kullanmaya çalışırsa, bu gerçekten pahalı olabilir.Değişkenlerinizden biri veya daha fazlası oldukça öngörülebilirse, belirli değerler için bunları optimize edin ve bilinmeyen için kalanı optimize edin. Daha fazla detay için bu bağlantıya göz atın.

https://blogs.msdn.microsoft.com/sqlprogrammability/2008/11/26/optimize-for-unknown-a-little-known-sql-server-2008-feature/

açık olmak gerekirse, bu, yukarıda ninjaPixel ile gösterildiği gibi bir sorun koklama bir parametre muhtemeldir. OPTIMIZE FOR UNKNOWN her sorguyu yeniden derlemeden daha iyi sonuçlar verebilir çünkü sorgu iyileştiricisi, derlemesini yapmak için istatistiklere güvenir.

+0

Teşekkürler. Başlangıçta ninjaPixel'e ödül verecektim ama bu cevap daha da iyi. –

+0

Sevindim Yardımcı olabilirim – quest4truth

2

Dinamik sorgunuza bir yorum ekleyin. var1, @ var2, @ var3 @ değişkenlerin açıklama değerlerinde koyun ve vb

Bu gibi görünecektir:

EXEC sp_executesql @myQuery, 
    /* var1Value, var2Value, var3Value */  
    N'@var1 INT, 
    @var2 INT, 
    @var2 INT', 
    @var1, 
    @var2, 
    @var3 

Yani, yürütme planı farklı değerler yalnızca yeniden derlemek olacaktır.

İlgili konular