Sorgular neden dökülme işlemine neden oluyor?


27

Arka fon

160 gb veritabanını MSSQL 2008'den (standart) bir Win 2008 sunucusunda 48 gb RAM ile Windows 2012'de 64 gb RAM ile MSSQL 2012 (64 bit web sürümü) çalıştıran yeni bir sunucuya geçirme sürecindeyim. Eski sunucu canlı ve yük altında; Yeni sunucu üretimde değil. Yeni sunucunun 8 adet tempdb dosyası vardır (her biri 4 GB).

Sorun

Yeni sunucu üzerinde yapılan testlerde, çok sayıda sorgudaki adımları görüyorum, "operatör çalıştırma sırasında veri dökmek için tempdb kullandı" ifadesini veriyor. Bazı sorguları yeniden yazarak çeşitlerden kaçınabildim, ancak bu sorunu çözmedi. Eski sunucudaki aynı sorgular dökülmelere neden olmaz. MSSQL'in bellekteki bir işlemi tamamlayamadığı ve / sayfasını tempdb içine dökmesi gerektiğinde dökülmelerin gerçekleştiğini okudum. Dökülmeler konusunda endişelenmeli miyim?

Örnekler

görüntü tanımını buraya girin

Veritabanında sp_updatestats kullandım, bu yüzden istatistikler güncel olmalı, ancak tahmini ve gerçek satır sayısı arasında bazı tutarsızlıklar olduğunu göreceksiniz.

Bellek endişe

64 gb'nin 58'lik MSSQL'i için bir maksimum bellek ayarı belirledim. Şu anda, MSSQL bu belleğin yaklaşık 35 gb'sini tüketmiştir ancak yalnızca 682 MB'lik bir çalışma kümesine sahiptir. Eski sunucu (üretimde olsa da, yük taşımada), 43.5 gb çalışma setinde olan MSSQL'e bağlı 44 gb belleğe sahip.

görüntü tanımını buraya girin

Dökülmelerin bir bellek ayarına bağlı olup olmadığını bilmiyorum - herhangi birinin fikri olan var mı? MSSQL'in şu an yedek RAM RAM'i vardır, peki neden bazı çeşitler ve karma eşleşmeler için tempdb'ye akıyor?


7
Yürütme planındaki uyarı 2012'de yeni. Eski sunucuda dökülmediğini kontrol ettiniz mi? Bunun için izliyor muydun?
Martin Smith

@ MartinSmith ah, uyarının yeni olduğunu bilmiyordu. Eski sunucudaki sızıntıları izlemiyordum. Bunu araştıracak.

1
Hafif teğet noktası ama ben, varsayılan olarak çoğunlukla tempdb seviye 0 dökülmelerine ve çalışma zamanının 25 sine neden olan çok iyi satır tahminleriyle birleştirme birleştirmeleri kullanan 10 masanın önünde oturuyorum. Karma birleştirmeleri zorlamak (ve sırayla) dökülmeleri giderir ve 9 saniye içinde akar. Birleşmeye karışma mı yoksa dökülme farkına neden olup olmadığını ve optimize edicinin görünüşte bilinen yaklaşan bir dökülmenin etkisini düzgün bir şekilde tartıştığını merak ediyorum (çünkü satır tahminleri çok iyi).
crokusek

Yeni sunucunun donanım numarası var mı?
stacylaray

Yanıtlar:


28

Burada birkaç farklı soru var:

S: Sorgular neden daha önce dökülmedi?

Onlardı, ancak SQL Server Management Studio bunu SQL 2012'den önce açık bir hata olarak ortaya koymadı. Performans ayarlama yaparken neden grafiksel uygulama planından daha derine inmeniz gerektiğinin harika bir örneği.

S: Sorgular neden diske dökülüyor?

Çünkü SQL Server, operasyonlarını tamamlamak için onlara yeterli hafıza vermedi. Belki de yürütme planı, gerekli bellek miktarını küçümsemiştir ya da belki de kutu bellek baskısı altındadır, ya da sadece büyük sorgular. (Unutmayın, SQL Server üç şey için bellek kullanır - ham veri sayfalarını önbelleğe almak, yürütme planlarını önbelleğe almak ve sorgular için çalışma alanı. Bu çalışma alanı belleğinin oldukça küçük olmasını sağlar.)

S: Dökülenleri nasıl azaltabilirim?

Sargable T-SQL deyimleri yazarak, güncel istatistiklere sahip, sunucuya yeterli bellek koyarak, doğru endeksleri oluşturarak ve işler istediğiniz gibi çalışmadığında yürütme planlarını yorumlayarak. Bunların ayrıntılı açıklamaları için Grant Fritchey'nin kitabı SQL Server Query Performance Tuning'e göz atın .

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.