Yazma ağırlıklı bir ürün için veritabanımız var. Yeni bir sunucuya SSD ile yardımcı olduk. Şaşırtıcı bir şekilde, eklemeler çok daha yavaş depolanan eski makinemizden daha hızlı değildi. Kıyaslama sırasında SQL Server işlemi tarafından sergilenen G / Ç oranının çok düşük olduğunu fark ettik.
Örneğin , döngüde bir BEGIN TRAN ve COMMIT eklediğim dışında , bu sayfada bulunan komut dosyasını çalıştırdım . En iyi ihtimalle disk kullanımı 7Mb / s'ye ulaşırken, CPU% 5'e neredeyse hiç dokunmadı. Sunucuda 64Gb kurulu ve 10 kullanıyor. Toplam çalışma süresi ilk arama için 2 dakika 15 saniye, sonraki aramalar için yaklaşık 1 dakika idi. Veritabanı basit kurtarma aşamasındadır ve test sırasında boştadır. Her çağrı arasına masayı bıraktım.
Bu kadar basit bir komut dosyası neden bu kadar yavaş? Donanım neredeyse hiç kullanılmıyor. Hem özel disk karşılaştırma araçları hem de SQLIO, SSD'nin hem okuma hem de yazma için 500Mb / s'den daha yüksek hızlarda doğru performans gösterdiğini gösterir. Rasgele yazmaların sıralı yazmalardan daha yavaş olduğunu anlıyorum, ancak kümelenmiş indeksleme olmayan bir tabloya böyle basit bir eklentinin çok daha hızlı olmasını beklerim.
Sonuçta senaryomuz çok daha karmaşık, ama önce basit bir vakayı anlamam gerektiğini hissediyorum. Özetle, uygulamamız eski verileri siler, daha sonra yeni verileri hazırlama tablolarına kopyalamak için SqlBulkCopy kullanır, bazı filtreleme gerçekleştirir ve son olarak verileri son tablolara kopyalamak için MERGE ve / veya INSERT INTO kullanır.
-> DÜZENLEME 1: Martin Smith ile bağlantılı prosedürü takip ettim ve şu sonucu aldım:
[Wait Type] [Wait Count] [Total Wait (ms)] [T. Resource Wait (ms)] [T. Signal Wait (ms)]
NETWORK_IO 5008 46735 46587 148
LOGBUFFER 901 5994 5977 17
PAGELATCH_UP 40 866 865 1
SOS_SCHEDULER_YIELD 53279 219 121 98
WRITELOG 5 145 145 0
PAGEIOLATCH_UP 4 58 58 0
LATCH_SH 5 0 0 0
NETWORK_IO, SQL dosyaları dışında hiçbir yerde görüntülenecek ve aktarılacak hiçbir veri olmadığını düşünerek, çoğu zaman alır. NETWORK_IO türü tüm ES'leri içeriyor mu?
-> EDIT 2: Bir 20Gb RAM disk oluşturdum ve oradan bir veritabanı monte ettim. SSD'de geçirdiğim en iyi zaman 48 saniye, RAM disk ile 37 saniyeye düştü. NETWORK_IO hala en büyük bekleme. RAM diskine maksimum yazma hızı yaklaşık 250Mb / s iken saniyede çok gigabayt yapabiliyordu. Hala fazla CPU kullanmıyordu, SQL'i tutan ne?
NETWORK_IO
mesajları geri gönderiliyor 3000000 "etkilenen 1 satır (lar)" dan olabilir. SET NOCOUNT ON
Senaryoya eklemeyi denedin mi?
EE_WaitStats*.xel
böylece eskileri sonuçlarınızı kirletir.
SET NOCOUNT ON
.