Her insert cümlesi için sp_executesql komutunu SQL Server Profiler'da görüyorum.


4

Ürünlerimizden biri için veri tabanımızı ve sorgularımızı ayarlamak için, QA ortamında Profiler'i açmaya ve ne gösterdiğini görmeye karar verdim.

Aradığım her ek için gördüm, insert ekleme metni ile sp_executesql çağrısı yapıldı.

Bu büyük bir hit gibi görünüyor, bunu kapatmak için bir yolu var mı?

Çevre:

  • SQL Server 2008 R2 Standardı
  • Windows Server 2008 R2 Enterprise
  • 32 GB RAM
  • 2x4 Xeon
9

Ben çok endişelenmem.

Fikir, yeniden kullanım için ifadeleri parametreleştirmektir.Yani derlemekten kaçının

3 farklı istemcinizin 3 ayrı ifade çalıştırdığını düşünün:

SELECT col1, col2 FROM SomeTable WHERE col3 = 1

SELECT col1, col2 FROM SomeTable WHERE col3 = 15

SELECT col1, col2 FROM SomeTable WHERE col3 = 42

Bunların her birinin farklı metni var bu nedenle farklı bir plana derlenecek.Yani, 3 derleme ve 3 önbelleğe alınmış plan.

Şimdi, bu 3

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '1'

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '15'

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '42'

Buradaki yeniden kullanılabilir plan ifade içindir.SELECT col1, col2 FROM SomeTable WHERE col3 = @p0yani sahipsinbirplan önbellektir.

Meşgul sistemlerde bu derleme zamanı önemlidir.Ve çoğu sorgu elbette bundan daha karmaşıktır: Bunu daha sonraki çalışma süreleri ile ilk çalıştırma süreleri için görebilirsiniz (bkz.Testing Query Speed)

Ayrıca karmaşık ve meşgul sistemlerde, plan önbellek boyutu sınırlandırılabilir veya RAM'i veri önbellekten (arabellek havuzu) uzaklaştırabilir, bu da işleri engelleyebilir.Aşırı 10000 plan veya yoğun bir web uygulaması için bir tane olabilir.(Etki 32 - 64 bit inceliklere bağlıdır)

Bazı ORM'ler ve sürücüler bu, genellikle "hazırlanmış ifadeler" veya bir seçeneğin kapatılmasına izin verir: ancak bazı şeyleri yavaşlatabileceği konusunda uyarılmalıdır."Bu büyük bir hit gibi görünüyor" dedin ki bu da yükten endişe duyduğunuz anlamına gelir ...

+2

Bazı sistemlerin bunu neden yaptığını * neden * olarak açıkla.Depolanan yordamları kullanmadan SQL'lerini parametreleştirmelerini sağlar. 15 eyl. 112011-09-15 19:06:11


4

Anladığımdan emin değilim, sp_executesql kullanmayı bırakmak mı istiyorsunuz?Öyleyse, bu yöntemi kullanmamak için kodunuzu değiştirmeniz yeterlidir..NET'te SQLCommand nesnesinin sp_executsql kullanacağına inanıyorum, bu nedenle .NET kullanıyorsanız bu aramayı görmeyi beklemelisiniz.


5

Çoğu ORM kullanıyorsanız (Link2SQL, EF vb.) Bu sevimli küçük yöntemin kullanılmasına neden olurlar.Parametreli bir insert cümlesi yazıyorsanız, bu yöntemde de ortaya çıkacaktır.

  0

Yani parametreleştirilmiş ekleri kullanarak bu sorunu çözemiyorum?Mesela ... hiç? 15 eyl. 112011-09-15 13:05:38

  0

Hayır!Tek seçeneğiniz kendi saklı yordamınızı kullanmak olacaktır. 15 eyl. 112011-09-15 17:19:53