Başvurana saygı duyurken, "dini nedenlerle" değil, verilen cevaba alçakgönüllülükle katılmıyorum. Başka bir deyişle, Microsoft'un sağladığı ve rehberlik için saklı yordamları kullanma ihtiyacını azaltan bir olanak bulunmadığını düşünüyorum.
Ham metin SQL sorgularının kullanılmasını destekleyen bir geliştiriciye sağlanan herhangi bir rehberlik, en tedbirli tavsiyenin Saklı Prosedürlerin kullanımını büyük ölçüde teşvik etmek olduğunu ve geliştirici ekiplerin pratiğe girmesini engellemek olduğunu düşündüğü şekilde birçok uyarı ile doldurulmalıdır. SQL deyimlerini koda gömme veya ham, düz eski metin tabanlı SQL isteklerini SQL SPROC'lerin dışında (saklı yordamlar) gönderme.
Bir SPROC kullanımının neden sunulduğu gibi olduğu sorusuna verilen basit cevabı düşünüyorum: SPROC'lar ayrıştırıldı, optimize edildi ve derlendi. Bu nedenle, sorgu / yürütme planları önbelleğe alınır, çünkü bir sorgunun statik bir gösterimini kaydettiniz ve normalde, yalnızca kopyalanan / yapıştırılan SQL ifadeleri durumunda doğru olmayan parametreler tarafından değişiklik göstereceksiniz. sayfadan sayfaya ve bileşen / katmandan sık sık farklı tabloların, hatta veritabanı adlarının bile, çağrı yapmak için belirtilebileceği ölçüde değişkenlik gösterir. Bu tür dinamik özel amaçlı izin vermeSQL gönderimi, DB Engine'in geçici ifadeleriniz için sorgu planını yeniden kullanma olasılığını, bazı çok katı kurallara göre büyük ölçüde azaltır. Burada, etkili Sistem SPROC sp_executesql kullanımı ile dinamik geçici sorgular (sorulanın ruhuna göre) arasında ayrım yapıyorum.
Daha spesifik olarak, aşağıdaki bileşenler vardır:
- Kullanıcı bağlamını taşımayan ve DB altyapısı tarafından yeniden kullanımına izin veren seri ve paralel sorgu planları.
- Bir sorgu planının farklı veri parametreleriyle yeni bir kullanıcı tarafından tekrar kullanılmasına izin veren yürütme bağlamı.
- DB motorunun aradığımız etkinlikleri yaratmak için sorguladığı işlem prosedürü.
Bir web sayfasından bir SQL ifadesi verildiğinde, "ad hoc deyimi" olarak adlandırılan motor, isteği işlemek için mevcut bir yürütme planını arar. Bu bir kullanıcıdan gönderilen metin olduğundan, geçerli olması halinde yutulur, ayrıştırılır, derlenir ve yürütülür. Şu anda sıfır bir sorgu maliyeti alacaksınız. Sorgu maliyeti, DB altyapısı hangi yürütmenin önbellekten çıkarılacağını belirlemek için algoritmasını kullandığında kullanılır.
Özel sorgular varsayılan olarak sıfır bir orijinal sorgu maliyet değeri alır. Aynı aynı geçici sorgu metninin ardından başka bir kullanıcı işlemi (veya aynı) tarafından yürütülmesinin ardından, geçerli sorgu maliyeti orijinal derleme maliyetine sıfırlanır. Geçici sorgu derleme maliyetimiz sıfır olduğundan, bu yeniden kullanım olasılığı için iyi bir işaret değildir. Açıkçası, sıfır en az değer verilen tam sayıdır, fakat neden tahliye edildi?
Bellek basınçları ortaya çıktığında ve sık kullanılan bir siteniz varsa, DB altyapısı Prosedür önbelleğinin kullandığı belleği nasıl geri alabileceğini belirlemek için bir temizleme algoritması kullanır. Hangi sorguların tahliye edileceğine karar vermek için mevcut sorgu maliyetini kullanır. Tahmin edebileceğiniz gibi, sıfır maliyete sahip olan planlar önbellekten ilk çıkarılandır, çünkü sıfır temel olarak "bu planın mevcut kullanıcıları veya referansları yoktur" anlamına gelir.
- Not: Özel uygulama planları - Geçerli maliyet, her kullanıcı işleminde, planın orijinal derleme maliyetinde artırılır. Bununla birlikte, hiçbir planın maksimum maliyeti, geçici sorgular durumunda ... sıfır olan orijinal derleme maliyetinden daha fazla olamaz. Bu nedenle, bu değerle "artırılacak" ... sıfır - bu aslında en düşük maliyet planı olarak kalacağı anlamına gelir.
Bu nedenle, böyle bir planın ilk önce bellek baskıları ortaya çıktığında çıkarılması muhtemeldir.
Bu nedenle, "gereksinimlerinizin ötesinde" çok fazla bellek içeren bir sunucunuz varsa, bu sorunu iş yükünü işlemek için yalnızca "yeterli" belleğe sahip yoğun bir sunucu kadar sık karşılaşmayabilirsiniz. (Üzgünüm, sunucu belleği kapasitesi ve kullanımı algoritma olmasa da, biraz öznel / akrabadır.)
Şimdi, bir ya da daha fazla nokta hakkında aslında yanılmıyorsam, kesinlikle düzeltilmeye açığım.
Son olarak, yazar şunu yazdı:
"Şimdi ifade düzeyinde optimizasyona sahibiz, bu nedenle bir uygulamadan gelen doğru parametreleştirilmiş bir sorgu, saklı bir prosedüre gömülü olan sorgu ile aynı yürütme planından faydalanabilir."
Yazarın "geçici iş yükleri için optimize et" seçeneğine değindiğine inanıyorum.
Öyleyse, bu seçenek tam sorgu planını Prosedür önbelleğine göndermekten hemen kaçınan iki aşamalı bir işleme izin verir. Sadece orada daha küçük bir sorgu saplaması gönderir. Sorgu saplaması hala Prosedür önbelleğindeyken tam bir sorgu çağrısı sunucuya geri gönderilirse, tam sorgu yürütme planı o zaman Prosedür önbelleğine kaydedilir. Bu bellek basınç olayları sırasında, bellek, tasarruf edebilir tahliye algoritması önbelleğe edildi daha büyük bir sorgu planı daha az sık saplama tahliye için izin verir. Yine, bu sunucu hafızasına ve kullanımına bağlıdır.
Ancak, varsayılan olarak kapalı olduğundan bu seçeneği açmanız gerekir.
Son olarak, çoğu zaman, geliştiricilerin SQL'i sayfalara, bileşenlere ve diğer yerlere yerleştirmesinin nedeni, esnek olmaları ve veritabanı motoruna dinamik SQL sorgusu göndermek istedikleridir. Bu nedenle, gerçek dünyadaki bir Kullanım Durumunda, aynı metni göndermek için, çağrı yönlendirme çağrısı, SQL Server'a geçici sorgular gönderirken aradığımız önbellekleme / verimlilik gibi gerçekleşmesi pek mümkün değildir.
Ek bilgi için lütfen bakınız:
https://technet.microsoft.com/en-us/library/ms181055(v=sql.105).aspx
http://sqlmag.com/database-performance-tuning/don-t-f--ynamic-sql
En iyisi
Henry