Saklı yordamlar için bir planın önbellekten eksik olmasının nedenleri nelerdir?
WITH RECOMPILE
- Dinamik SQL
- Şifreli kod
- Önemli veri değişiklikleri
- İstatistikleri güncelle
- Başka?
Son zamanlarda kaynak yoğun saklı yordamlar için önbellekte planları yoktu 2 sunucu (SQL Server 2008 R2 ve SQL Server 2012) üzerinde çalıştım. Saklı yordamlar içindeki ifadelerin çoğunun, belki de çoğunun önbellekte planları yoktu. Saklı yordamların bazıları saniyede birkaç kez olduğu gibi oldukça sık yürütülür.
Bellek baskısı yok. Sunuculardan birinde gerekenden çok daha fazla donanım var.
Eksik planları saklı yordamların ortasında geçici tablo oluşturma nedeniyle olduğunu düşündüm, ancak bu SQL Server 2000 veya daha eski eski bilgi gibi görünüyor. SQL Server 2005'ten başlayarak, yeniden derlemeler DDL sonrası ifadeler için deyim düzeyinde gerçekleşir. Bu her durumda doğru mu yoksa daha yeni sürümlerde de olabilir mi?
Eksik planlar için suçlu başka ne olabilir? Bu konuyla ilgili birkaç makale eksiktim, ancak hiçbir şey uygun görünmüyor.
Bu hafta baktığım sunucuda geçici iş yükleri için optimize et özelliği etkinleştirildi. Saklı yordamlardan biri günde yalnızca bir kez yürütülür. Bunun için bir kod var. Dakikada 100'den fazla yürütme için kod yok, ama alabilirim. Kodu gönderemem, ancak sorumla ilgili olarak tarif edebilirim.
Kimsenin prosedür önbelleğini boşalttığına veya temiz tamponlar bıraktığına inanmıyorum. Bu istemci Solarwinds DPA'yı izleme araçlarından biri olarak kullanıyor. DPA, günde bir kez çağrılan kayıtlı proc'taki ifade için yürütme planlarından birini yakaladı. Bu ifade, anlaşılamayan WHERE
fıkra nedeniyle büyük miktarda okumaya sahiptir . DPA ifadeyi yakaladıysa, tahmini bir plandır ve bir kerede plan önbelleğindeydi. Sorun giderirken orada değil. sp_WhoIsActive
Bir masaya giriş yapmaya başlayacağım .
Kullanıyorum sp_BlitzCache
. (Brent Ozar Unlimited için çalışıyorum) Bu, tüm saklı yordamın planını ve varsa bireysel ifadelerin planlarını gösterecektir. Yoksa, "Bu sorgu için bir plan bulamadık. Bunun olası nedenleri arasında dinamik SQL, RECOMPILE
ipuçları ve şifreli kod bulunur." Ve bu uyarı ifadelerde de var.
TF 2371 mevcut değil. Bekleme istatistiklerine bakıyorum. Sunucu oldukça sıkılmış. PLE 130.000'in üzerindedir.
Şimdi 2 daha saklı yordamlar için kod var. Bunlardan biri dinamik SQL kullanıyor, exec (@sql)
böylece bunun için neden bir plan olmadığını biliyoruz. Ama diğeri, ve dakikada 100 defadan fazla koşan, sıra dışı bir şey yok. Bu konuda göze çarpan tek şey, geçici tabloların 1000'den fazla kod satırının ortasında oluşturulmasıdır. Bir grup çocuk saklı yordamı da çağırır.
İlgili SQL Server 2008 yılında planı önbellekleme , herhangi değişmezleri> = 8k göremiyorum, ama bu başka bir saklı yordamı çağırır önce depolanmış prosedürlerden birini sağ uç bir toplu hakkında bir yorum vardır. Ancak toplu ek, baktığım dış saklı yordamda görünmüyor. Makalenin "Yeniden Derleme Eşiği" bölümü ilginçtir. Geçici tablolar için gördüğüm (milyonlarca satırla sonuçlanabilecek) tonlarca INSERT, bazı güncellemeler ve siler. Geçici tablolarda çok fazla veri değişiyor. Milyonlarca.