Sevgili [adınız burada]!
Oh hayır, bunu duyduğuma üzüldüm! Sizi bir an önce düzeltmek için bazı temel bilgilerle başlayalım.
Karşılaştığınız şeye Parametre Koklama adı verilir.
Çok garip bir problem. İsim dilden çıkıyor. Sincap için Almanca kelime gibi.
Ve bu genellikle senin arkadaşın.
Bir sorgu sunucunuza çarptığında, bir planın derlenmesi gerekir. Daha sonra zamandan ve kaynaklardan tasarruf etmek için, bir parametrenin kodunuzun işlenmesine ve dönmesine neden olacağı tahmin edilen satırlara dayanarak bir yürütme planı önbelleğe alınır.
Bunun kötü gittiğini anlamanın en kolay yolu, iki sabit popülasyondan gelen şeyleri sayması gereken saklı bir prosedür hayal etmektir.
Örneğin:
Açıkçası, bu kodun bir uygulaması diğerinden daha fazla iş yapmak zorunda kalacak ve tamamen farklı miktarlarda iş yapmak isteyeceğiniz sorgu planları tamamen farklı görünecektir.
Neye karşıyım?
Bu, bulmak, test etmek ve düzeltmek için gerçekten zor bir sorundur.
- Bulması zor çünkü sürekli gerçekleşmiyor
- Test edilmesi zor çünkü hangi parametrelerin farklı planlara neden olduğunu bilmeniz gerekiyor
- Düzeltmesi zor çünkü bazen sorgulama ve dizin ayarlama gerektiriyor
- Sorguları veya dizinleri değiştiremeyebilirsiniz çünkü düzeltilmesi zor
- Sorgulaması veya dizinleri değiştirseniz bile geri gelmesi zor olabilir
Hızlı Düzeltmeler
Bazen tek ihtiyacınız olan biraz netlik. Veya daha doğrusu, plan önbellek yapar.
Saklı bir prosedür ise
Koşmayı dene EXEC sys.sp_recompile @objname = N'schema.procname'
. Bu, prosedürün bir sonraki çalıştırılışında yeni bir planı yeniden derlemesine neden olur.
Bu ne düzeltmeyecek:
- Şu anda çalışan işlemler.
Bu neyi garanti etmiyor:
- Yeniden derlemeden sonra çalışan bir sonraki işlem size iyi bir plan veren bir parametre kullanacaktır.
Ayrıca sp_recompile
bir tablo veya görünümde gösterebilirsiniz , ancak o tablo veya görünüme dokunan tüm kodların yeniden derleneceği konusunda uyarılırsınız. Bu, sorunu çok daha zor hale getirebilir.
Parametreli bir sorgu ise
İşin biraz daha zor. SQL tanıtıcısını izlemeniz gerekir. Tüm plan önbelleğini boşaltmak istemezsiniz - tıpkı sp_recompile
bir masaya veya manzaraya karşı kullanmak gibi , bir sürü istenmeyen sonucu tetikleyebilir (ha ha ha).
Bu komutu çözmenin en kolay yolu sp_BlitzWho *! Tek bir planı önbellekten kaldırma komutunu içeren "fix parametresi koklama" adlı bir sütun var. Bununla birlikte, yeniden derleme ile aynı dezavantajlara sahiptir.
Bu ne düzeltmeyecek:
- Şu anda çalışan işlemler.
Bu neyi garanti etmiyor:
- Yeniden derlemeden sonra çalışan bir sonraki işlem size iyi bir plan veren bir parametre kullanacaktır.
Hala yardıma ihtiyacım var!
Aşağıdaki şeylere ihtiyacımız olacak:
- Mümkünse iyi sorgu planı
- Kötü sorgu planı
- Kullanılan parametreler
- Söz konusu sorgu
- Tablo ve indeks tanımları
Sorgu planlarını ve sorguyu almak
Sorgu çalışıyorsa, şu anda yürütülen sorguları yakalamak için sp_BlitzWho * veya sp_WhoIsActive kullanabilirsiniz.
EXEC sp_BlitzWho;
EXEC sp_WhoIsActive @get_plans = 1;
Sorgu şu anda yürütülmüyorsa, sp_BlitzCache * kullanarak plan önbelleğinde kontrol edebilirsiniz .
SQL Server 2016+ kullanıyorsanız ve Sorgu Mağazası açıksa, sp_BlitzQueryStore * uygulamasını kullanabilirsiniz .
EXEC dbo.sp_BlitzCache @StoredProcName = 'Your Mom';
EXEC dbo.sp_BlitzQueryStore @StoredProcName = 'Your Mom';
Bunlar, Kayıtlı İşleminizin önbelleğe alınmış versiyonlarını izlemenize yardımcı olacaktır. Sadece parametreli kod ise, aramanız biraz daha zor. Bununla birlikte, bu yardımcı olabilir:
EXEC dbo.sp_BlitzCache @QueryFilter = 'statement';
Bunlardan herhangi birinin oldukça benzer çıktısını görmelisiniz. Yine, serin mavi tıklama sütunu davet eden sorgu planı arkadaşınızdır.
Planları paylaşmanın en kolay yolu, Plan Yapıştır * 'ı kullanmak veya XML'i pastebin içine atmaktır. Bunu elde etmek için mavi tıklamalı sütunlar davet edenlerden birine tıklayın. Sorgu planınız yeni bir SSMS sekmesinde görünmelidir.
Şirketinizin kodunu ve sorgusunu paylaşma konusunda temkinliyseniz, planınızı gizlemek için Sentry One'ın ücretsiz Plan Gezgini aracını kullanabilirsiniz. Aklınızda bulundurun, bu yardım almayı zorlaştırır - anonimleştirilmiş kodun okunması ve çözülmesi çok daha zordur.
Bahsettiğimiz tüm bu araçlar Sorgu Metnini döndürmelidir. Burada başka bir şey yapmana gerek yok.
Parametreleri almak biraz daha zor. Plan Explorer kullanıyorsanız , alt kısımda hepsini sizin için listeleyen bir sekme vardır.
Sp_BlitzCache * kullanıyorsanız , saklı yordamlar için çalıştırma ifadesini veren tıklanabilir bir sütun var.
Tablo ve dizin tanımlarını alma
Bir şeyleri kopyalamak için kolayca SSMS'ye sağ tıklayabilirsiniz.
Her şeyi tek seferde almak istiyorsanız, sp_BlitzIndex *, doğrudan masaya yöneldiğinizde yardımcı olabilir.
EXEC dbo.sp_BlitzIndex @DatabaseName = 'StackOverflow2010',
@SchemaName = 'dbo',
@TableName = 'Users';
Bu size tablo tanımını (bir create ifadesi olarak olmasa da) verecek ve tüm indeksleriniz için ifadeler yaratacaktır.
Sorunuza bu bilgiyi toplayıp eklemek, insanlara yardım edecek yeterli bilgiyi sağlamalıdır veya sizi doğru yöne yönlendirmelidir.
Kendim yapmak istiyorum!
Güzel Senin adına sevindim. Seni deli insan
İnsanların "koklama" parametresini koklamada "düzelttiklerini" düşünme yolları vardır:
Ancak bunlar gerçekten farklı şekilde koklama parametresini etkisiz hale getirir. Bu, sorunu çözemediklerini söylemek değildir, sadece kök nedene gerçekten ulaşamazlar.
Bunun nedeni kök nedene ulaşmak genellikle zor bir iştir. Bu sinir bozucu "plan kalite sorunları" aramak zorunda.
Hızlı vs yavaş planlardan başlayarak, gibi farklılıkları araştırın:
- Kullanılan endeksler
- Siparişe katıl
- Seri ve Paralel
Ayrıca, kodunuzu parametre koklamasına karşı hassas kılan farklı operatörleri arayın:
- aramaları
- sıralar
- Birleştirme türü
- Hafıza hibeleri (ve buna göre, dökülmeler)
- Makaralar
Tarama, indeks parçalanması ya da insanların uğraştığı ve yükünü zorlayan şeyleri araştırmaya çok fazla sarılmayın.
Genellikle oldukça basit bir indeksleme problemi vardır. Bazen kodun biraz yeniden yazılması gerekir.
Parametre koklama hakkında daha fazla bilgi edinmek istiyorsanız:
Bunu okuyorsanız ve bir bağlantıyı veya yararlı bir aracı özlediğimi düşünüyorsanız, yorum yapın. Bunu güncel tutmak için elimden geleni yapacağım.