Neden sorgum aniden dünden daha yavaş?


76

[Selamlar]

(birini kontrol et)

[ ] Well trained professional, [ ] Casual reader, [ ] Hapless wanderer,

Bende var (geçerli olanları kontrol et)

[ ] query [ ] stored procedure [ ] database thing maybe  

iyi çalışıyordu (varsa)

[ ] yesterday [ ] in recent memory [ ] at some point 

ama şimdi aniden yavaşlıyor.

Engellenmediğinden ve uzun süredir devam eden bakım görevlerinin, raporların veya diğer bir grup dışı sürecin kurbanı olmadığından emin olmak için zaten kontrol ettim.

Sorun nedir, ne yapmalıyım ve yardım almak için hangi bilgileri sağlayabilirim?

[*Insert appropriate closing remarks*]

Yanıtlar:


88

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:

  • Yaralanmayan CrossFit forma giyen insanlar: Sıfır

  • İstedikleri zaman çekinen CrossFit forma giyen insanlar: Hepsi

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_recompilebir 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_recompilebir 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;

FINDIK

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.

FINDIK

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.

FINDIK

Ş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.

FINDIK

Sp_BlitzCache * kullanıyorsanız , saklı yordamlar için çalıştırma ifadesini veren tıklanabilir bir sütun var.

FINDIK

Tablo ve dizin tanımlarını alma

Bir şeyleri kopyalamak için kolayca SSMS'ye sağ tıklayabilirsiniz.

FINDIK

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.



28

Parametre koklama, bir sorgunun değişen performansının tek olası nedeni değildir. Aşağıdaki genel sebeplerden biri aynı belirtileri gösterebilir:

  1. Veri dağıtımı / hacmi değiştirildi, optimize edici bir arama ağacı karar devrilme noktası geçildi
  2. Dizinler / dosyalar parçalandı
  3. İstatistikler güncellendi / eklendi / düşürüldü veya veri değişiklikleri nedeniyle eski ve yanıltıcı oldu
  4. Windows bellek kullanımı değişti
  5. İşlem günlükleri dolu ve kısaltılmıyor, fiziksel dosya genişlemesinin tekrarlanmasına neden oluyor
  6. Şema değişti - dizin / dizinlenmiş görünüm / sütun / sınırlama eklendi, değiştirildi veya bırakıldı, veri türü değişti
  7. İzleme bayrağı ayarları değişti
  8. Windows güncellemesi uygulandı
  9. Veritabanı veya sunucu ayarı değişti
  10. Sunucu CU seviyesi değişti
  11. İstemci uygulaması oturumu ayarları değişti

Bu listedeki 6 - 11. Maddeler ancak belirli bir işlem yapıldıktan sonra gerçekleşebilir. Sanırım bunları dışlamak istemiştiniz, ancak çoğu zaman zorlukla karşılaşanlar, başkasının değişiklik yaptığının farkında değiller ve plan önbellek girişlerini temizleme yoluna çıkmadan önce kontrol etmeye değer.


1
Paul düzenleme için teşekkürler. @ sp_BlitzErik - Belirli konular hakkında tavsiyelerde bulunmak, sadece var olduklarının farkındalığını artırmak ve kontrol edilmeye değer olabilir. Bu hiçbir şekilde harika görevinizden düşmek anlamına gelmez. Derinlemesine koklama parametresi ile profesyonelce ve iyi bir espri ile başa çıktınız. Okumaktan zevk aldım. Ben sadece burada birileri bu gönderiyi ziyaret ederse, akılda kalan başlığın ardından, alternatif potansiyel sebeplerden haberdar edildiğinden emin olmak istiyorum. IMHO yayınınıza değer katar, ancak hala silmemi istiyorsanız, bana bildirin.
SQLRaptor

Hayır, hiç de değil. Asla birinden yanlış veya zararlı olmayan bir cevabı silmesini istemem. Hala biraz detay ekleyebileceğini düşünüyorum, ama sonuçta sana kalmış.
Erik Darling,

10

Sadece yardım etmeme ihtimaline karşı mevcut cevapları eklemek için, "aniden" sorgularınız ertesi gün farklı davrandıklarında, şunları kontrol edin:

  • Kullanılan tabloların şeması son zamandan beri değişti mi? SSMS durumunda, Nesne Gezgini'nde sunucuyu sağ tıklayıp seçebilirsiniz Reports → Standard Reports → Schema Changes History.
  • Öğe sayısı önemli ölçüde arttı mı? Belki de kullanılan tablolarda çok fazla veri olduğunda sorgunuz çok daha yavaştır.
  • Veritabanını sizinle aynı anda kullanan başka biri var mı? Belki birbirinizin işine karışamayacağınız zaman aralıklarını seçin.
  • Sistem istatistikleri nasıl görünüyor? Belki sunucu sıcak çalışıyor ve CPU'yu boğuyor ya da sabit disklerde boş alan ya da yer değiştirme var. Belki de sunucu odasında yangın veya sel gibi başka bir donanım sorunu var.

7

Diğer bir olasılık ise, Altyapı Ekibinizin VMware'de vMotion gibi araçları kullanması ve SQL örneğinizi destekleyen VM'nin DBA hakkında hiçbir bilgisi olmadan sorunsuzca Host'tan Host'a taşınmasıdır.

Altyapınız dışardan kaynaklandığı zaman bu gerçek bir sorun ... Onunla gerçek bir kabus görüyorum.

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.