SQL Server, performans karşılaştırması gerçekleştirmeden önce önbellekleri temizleme komutları


46

İki farklı sorgunun yürütme süresini karşılaştırırken, ilk sorgunun yürütülmesinin ikincinin performansını değiştirmediğinden emin olmak için önbelleği temizlemek önemlidir.

Google Arama’da şu komutları bulabilirim:

DBCC FREESYSTEMCACHE
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE

Aslında, benim sorgularım daha önce yaptığım birkaç idamın ardından tamamlamak için daha gerçekçi bir zaman alıyor. Ancak bunun önerilen teknik olduğundan emin değilim.

En iyi uygulama nedir?

Yanıtlar:


43

Şahsen, ortak bir sorgu için 2. ve sonraki işlemler daha önemlidir.

Disk GÇ veya sorgu performansını test ediyor musunuz?

Sorgunuzun sık sık çalıştığını ve kritik olduğunu varsayalım, o zaman bunu gerçek yaşam koşulları altında ölçmek istersiniz. Ve her seferinde prod server önbelleklerini temizlemek istemezsin ...

İstersen yapabilirsin:

  • DBCC DROPCLEANBUFFERStampon havuzu temiz (modifiye edilmemiş) sayfaları temizler
    bir o Öncü CHECKPOINTbirinci diske herhangi bir kirli sayfaları temizlemesini
  • DBCC FLUSHPROCINDB bu veritabanı için yürütme planlarını temizler

Ayrıca bakınız (DBA.SE’de)


3
Çalışırken hata DBCC FLUSHPROCINDBoluştu: DBCC deyimine hatalı sayıda parametre verildi.
Xin

Sonunda buldum: DECLARE @myDb AS INT = DB_ID(); DBCC FLUSHPROCINDB(@myDb); GOburadan: stackoverflow.com/questions/7962789/…
Hans Vonn

14

Geç cevap ancak diğer okuyucular için yararlı olabilir

DBCC DROPCLEANBUFFERS, sorgu testi ve sorgu yürütme hızını ölçmek için sıklıkla kullanılan bir komuttur. Bu komut (çalıştırıldığında) yalnızca küçük bir veri bölümü olan kirli sayfaların arkasına bırakılır. Tüm sunucunun tüm temiz sayfalarını kaldırır.

Bu komutun üretim ortamında çalıştırılmaması gerektiğini unutmayın . Bu komutu çalıştırmak çoğunlukla boş tampon önbelleği ile sonuçlanacaktır. DBCC DROPCLEANBUFFERS komutunu yürüttükten sonra herhangi bir sorguyu çalıştırmak, verileri büyük olasılıkla bellekten çok daha yavaş olacak şekilde önbelleğe geri getirmek için fiziksel okumaları kullanacaktır.

Yine, bu komutu DBCC FREEPROCCACHE'ye benzer şekilde ele alın - ne yaptığınızı kesinlikle bilmiyorsanız herhangi bir üretim sunucusunda çalıştırılmamalıdır.

Bu yararlı bir geliştirme aracı olabilir çünkü performans sınama ortamındaki bir sorguyu, bellekteki verilerin önbelleğe alınması nedeniyle hız / verimlilikte herhangi bir değişiklik yapmadan tekrar tekrar çalıştırabilirsiniz.

Daha fazla bilgi için: http://www.sqlshack.com/insight-into-the-sql-server-buffer-cache/


9

Her zaman kullanmam söylendi:

dbcc dropcleanbuffers;

Gönderen MSDN :

Sunucuyu kapatıp yeniden başlatmadan soğuk sorgulama önbelleği olan sorguları test etmek için DBCC DROPCLEANBUFFERS kullanın.

Tampon havuzundan temiz tamponları bırakmak için, ilk önce soğuk tampon önbellek üretmek için CHECKPOINT kullanın. Bu, geçerli veritabanının tüm kirli sayfalarını diske yazılır ve arabellekleri temizler. Bunu yaptıktan sonra, tüm arabellekleri arabellek havuzundan kaldırmak için DBCC DROPCLEANBUFFERS komutunu verebilirsiniz.


2
Artı: DBCC FREEPROCCACHEönbelleğe alınmış tüm yürütme planlarını temizlemek için ...
marc_s

1
Sadece
IO'yu

3

Diğer cevaplar için nedenleri hakkında doğru değil koşmak DBCC FREEPROCCACHE. Ancak, bunu yapmanın birkaç nedeni de var:

  1. Tutarlılık

Aynı şeyi farklı şekillerde yapmaya çalışan iki farklı soruyu veya işlemi karşılaştırmak istiyorsanız, aynı sayfalara ulaşma olasılıkları yüksektir. Saf bir şekilde # 1 numaralı sorguyu çalıştırırsanız, # 2 numaralı sorguyu çalıştırırsanız, ikincisi daha hızlı olabilir; çünkü bu sayfalar ilk sorgu tarafından önbelleğe alınır. Her yürütmeden önce önbelleği temizlerseniz, düz bir zeminde başlarlar.

Sıcak önbellek performansını sınamak istiyorsanız, sorguları birkaç kez çalıştırdığınızdan, değiştirdiğinizden ve ilk birkaç çalıştırmayı attığınızdan emin olun. Sonuçları ortalama.

  1. En kötü durum performansı

Sıcak önbelleğe karşı bir saniye, soğuk bir önbelleğe karşı bir dakika süren bir sorunuz olduğunu varsayalım. Bellek içi sorguyu% 20 daha yavaş, ancak IO'ye bağlı sorguyu% 20 daha hızlı yapan bir optimizasyon büyük bir kazanç olabilir: normal işlemler sırasında, normal şartlar altında hiç kimse fazladan 200 msn normal koşullarda fark etmez diske karşı çalıştırmak, 60 yerine 48 saniye sürmek bir satıştan tasarruf sağlayabilir.

Bu, onlarca gigabayt belleğe ve nispeten hızlı SAN ve SSD depolamaya sahip modern sistemlerde daha az endişe vericidir, ancak yine de önemlidir. Bazı analistler, arabellek önbelleğinizin yarısını silecek olan OLTP veritabanınıza karşı büyük bir tablo tarama sorgusu gerçekleştirirse, depolama açısından verimli sorgular sizi daha hızlı hızlandırmanızı sağlar.

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.