SQL Server için silme hızını artırın


12

Büyük üretim veritabanımız var, boyutu 300GB civarında. Silme sorgusunun performansını artırmak için herhangi bir yaklaşım var mı? Şu anda silme hızı dakikada 1-10k arasında, bizim için çok yavaş.


2
Dakikada 1000 satır son derece yavaş geliyor. Engelleme yaşıyor musunuz? Yoksa satırları seçmek de yavaş mıdır, bu da indeks ihtiyacı olduğunu gösterir mi?
James Z

Muhtemelen silme ölçütlerinizi karşılayacak bir dizin oluşturmanız gerekir.
Ginden

6
Yanıt vermek için yeterli ayrıntı yok. Hangi sorguyu yürütüyorsunuz? İlgili ölçüt sütunlarında (varsa) dizinleriniz var mı? Silme işleminde tetikleyiciniz var mı? ...
Sébastien Sevrin

3
Bir kerede bir milyar satırı silmeye mi çalışıyorsunuz? Otomatik büyüdükten sonra otomatik büyümeden sonra otomatik büyümeyi beklemeniz mümkün müdür? (Gerçek silme etkinliği değil, beklediğiniz günlük etkinliği olması muhtemeldir.) Bu makaleye bakın ...
Aaron Bertrand

3
Ayrıca. Herhangi bir yabancı anahtar kısıtlaması var mı? Lütfen eksiksiz tablo tanımı, sorgu ve yürütme planı sağlayın.
Martin Smith

Yanıtlar:


20

Tek bir ifadede çok sayıda satırı silmeye çalışıyorsanız, büyük olasılıkla günlük etkinliğini bekliyorsunuzdur. Böylece yapabilirsiniz:

  1. Büyüme olaylarının sizi yavaşlatmaması için günlüğünüzün yeterince boyutlandırıldığından emin olun. Varsayılan değerlerle, günlüğünüz muhtemelen% 10 büyüme ile 1MB'den başlar. Büyüme olayları pahalıdır ve 10 GB'lik silme işlemlerini günlüğe kaydediyorsanız, bu sadece şimdi değil, gelecekte de (VLF'lere ne yaptığı nedeniyle) performansı yok edecektir.
  2. Tüm tabloyu siliyorsanız, TRUNCATEveya DROP/ tuşlarını kullanın CREATE.
  3. Tablonun çoğunu siliyorsanız , SELECT INTOsaklamak istediğiniz verileri başka bir tabloya koymak için düğmelerini kullanın TRUNCATE, ardından küçük bölümü geri taşıyın. (Veya eski tabloyu bırakın, yeni tabloyu yeniden adlandırın ve kısıtlamaları / izinleri yeniden uygulayın vb.)
  4. Verileri tek seferde değil, parçalar halinde silerek günlük kaydının etkisini en aza indirin. Bkz bu yazıyı . Geçici kurtarma işlemine geçici olarak geçmeyi de düşünebilirsiniz, böylece CHECKPOINTgünlük yedeklemelerini almak yerine yalnızca günlüğü temizlemeniz gerekir, ancak günlük zincirini yeniden başlatmak için yeniden ayarladığınızdan ve yeni bir tam yedek aldığınızdan emin olmanız gerekir. .

+1, mükemmel bir makale için benden. Bu, geçmişte geliştiricilerimize, günlük dosyasındaki yavaşlık ve büyüme için bize ulaşmaya devam ettiklerinde silme işlemini anlamalarını sağladı.
KASQLDBA

Ayrıca, gereksiz dizinler varsa, bunları silmek silme hızını artıracaktır. Yine tüm verilerin tümünü veya neredeyse tamamını siliyorsanız, önce tüm dizinleri bırakmak ve daha sonra tekrar oluşturmak iyi bir etki yaratabilir.
Tony Hinkle

3
@ Dizini bırakarak, aynı zamanda bu maliyeti ödemek istediğinizde de olabilir. Test yapmadan, silme senaryosu için büyük bir avantaj olduğuna ikna olmadım (ekleme / güncelleme için olduğu gibi), daha sonra saklayamayacağınız dizinler yoksa.
Aaron Bertrand

FK kısıtlamalarının geçici olarak devre dışı bırakılması sorguyu iyileştirebilir mi?
Lev Z

3

Bazı ipuçları var, ancak hangi sürümü kullanıyorsunuz? Kurumsal sürüm mü? Neyse:

  1. Yapabiliyorsanız, işlem günlüğünü daha hızlı bir diske taşıyın
  2. Nerede olduğunu analiz edin . Silinecek kayıtları tanımlamak için bir dizin kullanacak mı? Değilse, bir dizin ekleyebilir misiniz?
  3. Tabloda bırakabileceğiniz bir dizin var mı? Cevabınız evet ise, bırakın.
  4. Bu masaya karşı yabancı anahtarlarınız var mı? Bunlar silmenizi gerçekten yavaşlatabilir.
  5. Bir kurumsal sürümünüz varsa ve darboğaz, satır düzeyinde bir sıkıştırma olan disk IO ise, size biraz yardım edebilir (veya verilerinize bağlı olarak değil)
  6. Masayı bölebilir misiniz? Yerel dizinler ve bölümlerin düşmesi daha hızlı olabilir.
  7. Etkinlik izleyicisi aracılığıyla darboğazın nerede olduğunu araştırın.

Ayrıntıları ekleyin, büyük veritabanı ile çalışırken geçerli tek bir cevap yoktur.


0

Bunları yığın olarak silmeyi, muhtemelen döngüde silmeyi, her bir yinelemeyi kendi işlemini silmeyi ve ardından her döngü yinelemesinin sonunda günlüğü temizlemeyi denemelisiniz.

Ayrıca, kayıtları silmek için yığın olarak değer olarak kullanacağınız sayıyı bulmanız gerekir. Kapsamlı bir test gerektirir, önce UAT'ta yığın değerini test edebiliyorsanız daha iyi olur.

Nasıl devam edeceğiniz konusunda sizi büyük silme işlemlerini parçalara ayırmaya yönlendirir


0

Büyük tablonun özyinelemeli yabancı anahtarı varsa silme işlemi yavaş olabilir.

öyleyse, fırsat zamanını bulun, bağımlı hizmetleri devre dışı bırakın, özyinelemeli yabancı anahtarı devre dışı bırakın, büyük silme yapın, ardından yabancı anahtarı tekrar geri yükleyin.


bu kesinlikle benim durumumdu. Kontrendikasyonu devre dışı bırakmak biraz riskli, ancak silme 1 satır / seocnd'tan 500 / saniyeye gitti
Jurion

0

Birkaç nokta daha ekleniyor ...

  1. Yüklemenin üzerinde dizin olup olmadığını kontrol etmeyi deneyin ve ayrıca istatistikleri görün.
  2. Çok sayıda satır siliyorsanız ve geçici tablo seçeneği istemiyorsanız. tablockSeçenek için git .
  3. Tetikleyicilerinizin olup olmadığını, özellikle silme tetikleyicilerinden sonra görün.

Daha fazla yardım almak için, kullandığınız sorguyu, tablo bilgilerini ve engelleme bilgilerini gönderin.

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.