Saklı yordamlar için eksik yürütme planları


12

Saklı yordamlar için bir planın önbellekten eksik olmasının nedenleri nelerdir?

  1. WITH RECOMPILE
  2. Dinamik SQL
  3. Şifreli kod
  4. Önemli veri değişiklikleri
  5. İstatistikleri güncelle
  6. 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 WHEREfı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_WhoIsActiveBir 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, RECOMPILEipuç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.


Sorunu destekleyen depolanmış proc'lara sahip olduğunuz için, sorunu aşan minimal bir örnek oluşturabilir ve bunu yaparken sorunu öğrenin?
Martin Smith

Yanıtlar:


3

İki plan önbellek DMF'si vardır:

sys.dm_exec_query_plan - önbelleğe alınmış planları XML biçiminde döndürür, ancak yalnızca belirli bir boyuta kadar (ve yalnızca SQL Server'da XML olarak biçimlendirilebildiği sürece, yani 128 iç içe düzey anlamına gelir).

sys.dm_exec_text_query_plan - önbellekteki planları herhangi bir boyutta metin biçiminde döndürür. Ama dezavantajı, planlar büyük olduğunda, bunları SQL Server içindeki XML'ye dönüştüremezsiniz ve XML olarak null olarak TRY_CONVERT bile.

sp_BlitzCache sadece eski DMV vurur (çünkü dilimleme ve dilimleme her türlü yapmak için sorgu planlarını XML olarak analiz etmesi gerekir.) Bunu geliştirmek için Github sorunu # 838 yaptım, böylece en azından kullanıcıların sys.dm_exec_text_query_plan daha büyük sorgular. Yine de üzerinde XML analizi yapamayız.


Ve ayrıca aynı nedenle sys.query_store_plan.query_planolduğu nvarchar(MAX)değil, XML (SQL önemsiz).
Remus Rusanu

@RemusRusanu ooo, çok büyük planlar var! Güzel.
Brent Ozar

Eksik planların bulduklarınızdan kaynaklanıp kaynaklanmadığını kontrol ediyoruz. Geri duyar duymaz bir güncelleme yayınlayacağım.
Tara Kizer

İstemciden haber alamasam da bunu cevap olarak işaretliyorum. Olabilecek tek şey kaldı ve muazzam sorgular göz önüne alındığında mantıklı. Bir şey değişirse güncelleme göndereceğim.
Tara Kizer

@TaraKizer bunu sadece üç ayda bir incelemeniz yaklaştığı için yapıyorsunuz, değil mi? Orada ne yaptığınızı görüyorum. BONUS KİLİDİ ​​AÇILDI.
Brent Ozar

0

Muhtemelen SSMS tarafından bir ızgaraya döndürülebilecek maksimum XML boyutunu ayarlamanız gerekir?


Hayır, çünkü Tara'nın belirttiği gibi, bir tabloya yazıp orada uzunluğu kontrol etseniz bile veri geri gelmez.
Brent Ozar
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.