SORU
27 Ocak 2010, ÇARŞAMBA


Bcp/BULK INSERT performans Tablo Değerli Parametreleri vs.

Ben için yeniden bazı oldukça eski kodu kullanarak SQL Sunucu BULK INSERT komut çünkü şema değişti, anladım belki de ben bir düşünmeliyiz geçiş için bir saklı yordam ile IZLEMEK yerine, ama merak ediyorum ne etkisi var performans.

Bu soruyu niye sorduğumu açıklamaya yardımcı olabilecek bazı bilgiler:

  • Veri aslında bir web servisi aracılığıyla gelir. Web hizmetini devre BULK INSERT gerçekleştiren bir veritabanı sunucusunda paylaşılan bir klasöre bir metin dosyasına yazar. Bu süreç başlangıçta uygulanan SQL Server 2000, ve orada gerçekten hiçbir alternatif başka aynalı bir kaç yüz INSERT tablolarda server, aslında özgün süreç ve bir performans felaket.

  • Verileri toplu kalıcı hazırlama bir tablo eklenir ve daha sonra çok daha büyük bir tabloya sonra basamak tablosundan silinir () birleşti.

  • Eklemek için veri miktarı"", ancak "-10k 5 satır nadir durumlarda en fazla." - genellikle bir kaç yüz metre, belki büyük büyük Bu nedenle benim hislerime BULK INSERT olmayan günlüğe bir ameliyat olmak zorunda kalmayacakbubir fark (ama elbette, dolayısıyla soru değilim) büyük.

  • Ekleme aslında çok daha büyük olmayanın bir toplu iş sürecinin bir parçası olduğunu ve olması gerektiğini arkaya birçok kez; bu nedenle performanskritik.

Bir IZLEMEK BULK INSERT değiştirilmesini istiyorum nedenleri vardır:

  • Metin üzerinde Netbıos dosya yazma zaten biraz zaman mal oluyor, ve mimari açıdan çok korkutucu olabilir.

  • Çalışma tablosu (ve) ortadan kaldırılabilir inanıyorum. Temel amaç var olan eklenen veri ihtiyaçları için kullanılacak birkaç diğer güncellemeleri aynı anda ekleme ve çok pahalılaşan girişimi güncelleştirmeyi büyük üretim tablo daha kullanmak neredeyse boş basamak tablosu. Bir IZLEMEK, parametre temeldeçalışma tablosu, bir şey istediğim ana ekledikten sonra/önce yapabilirim.

  • Çok uzakta eğer kontrol, temizleme kod ve yükü tüm toplu ekler ile ilişkili yapabilirim.

  • Endişe etmeye gerek çalışma tablosu kilidi çakışması veya sunucu bu işlemler birkaç kez alırsa Matrix Depolama Teknolojisi (bunu önlemek için deneyin, ama oluyor).

Ben açıkçası gitmek profili bu daha önce de koyarak, her şeyi içine üretim, ama ben düşündüm de belki iyi bir fikir istemek için ilk önce geçirdiğim onca zaman, hiç kimseye herhangi bir kıç uyarılar için sorun hakkında TVPs kullanarak, bu amaç için.

- SQL Server ile rahat yeterli olan herkes için 2008 kararın ne çalıştı ya da en azından bu soruşturma için? Birkaç bin satır için, diyelim ki, birkaç yüz ekler, oldukça sık sık oluyor, TVPs bitir? Toplu ekler kıyasla performans açısından önemli bir fark var mı?


Güncelleme: 92% daha az soru işareti olan Şimdi!

(NAM-ı diğer: Test Sonuçları)

Sonuç şimdi 36 aşamalı bir dağıtım süreci nasıl hissettirdiğini sonra üretim. Her iki çözüm de kapsamlı bir şekilde test edildi:

  • Paylaşılan klasör kodu almak ve doğrudan SqlBulkCopy sınıfını kullanarak;
  • TVPs ile Saklı bir Yordam geçiyorum.

Sadece okuyucuya bir fikir edinebilirsiniznetam olarak, bu verilerin güvenilirliğiyle ilgili şüpheleri yatıştırmak için test buradaydı nedir bu alma işlemi ile ilgili daha ayrıntılı bir açıklamaaslında yok:

  1. Normalde 20-50 veri noktaları hakkında geçici bir veri dizisi ile başlar bazen birkaç yüz olabilir rağmen);

  2. Veritabanı çoğunlukla bağımsız olan deli işleme bir sürü yapmak. Bu işlem parallelized, (1) sahneleri 8-10 aynı anda işleniyor. Her paralel işlem 3 ek dizileri oluşturur.

  3. Tüm 3 serileri ve özgün sırasını alıp, bir parti bir araya getirin.

  4. Her 8-10 şimdi bitmiş süper parti büyük görevlere işleme toplu birleştirin.

  5. Ya BULK INSERT strateji (sonraki adıma bakın), ya da IZLEMEK stratejisi (8) kullanarak alma.

  6. SqlBulkCopy Sınıf 4 kalıcı hazırlama tabloya süper-toplu tüm dökümü için kullanın.

  7. Çalıştırın bir Saklı Yordam (a) gerçekleştiren bir grup toplama adımları 2 tablolar da dahil olmak üzere çeşitli JOIN Koşulları, ve sonra (b) gerçekleştirir MERGE 6 üretim tabloları kullanarak hem toplu ve olmayan toplu veriler. (Bitti)

    YA

  8. Oluşturmak 4 DataTable nesneleri içeren verilere birleştirilecek; 3 bunları içeren CLR türleri ne yazık ki değil düzgün tarafından desteklenen ADO.NET TVPs, bu yüzden onlar için itti gibi dize temsilleri, performans ağrıyor biraz.

  9. Doğrudan alınan tablo aslında (7) aynı işlem yapan bir Saklı Yordam, ama TVPs yem. (Bitti)

Sonuçlar oldukça yakındık, ama IZLEMEK sonuçta veri küçük bir miktar ile 1000 satır aştı bile daha iyi ortalama olarak gerçekleştirilen, yaklaşım.

Not: bu alma işlemi çalıştırmak binlerce kez art arda, bu yüzden çok kolay oldu almak ortalama zaman sadece sayarak kaç saat (Evet saat) sürdü bitirmek için tüm birleştirir.

Aslında, ortalama neredeyse tam olarak aldı tam 8 saniye (normal yük altında Birleştir. Netbıos çakma çıkarma ve geçiş SqlBulkCopy neredeyse tam 7 saniye için zaman azalır. TVPs geçiş için daha fazla zaman azalır5.2 saniyetoplu iş başına. Bir35% iyileşmesaat ölçülen bir işlem için işlem hacmi fena değil yani. Ayrıca SqlBulkCopy üzerinde ~%'lik bir gelişme.

Aslında gerçek iyileşme bu önemli ölçüde daha fazla olduğunu oldukça eminim. Test sırasında oldu belli ki son birleştirme oldu artık kritik yol; bunun yerine, Web Hizmeti yaptığına dair tüm veri işleme başlangıç için toka altındaki numarayı talepleri geliyor. Ne CPU ne de g/Ç veritabanı gerçekten maxed edildi, ve önemli kilit faaliyet vardı. Bazı durumlarda ardışık birleştirir arasında birkaç boşta saniyelik bir boşluk gördük. SqlBulkCopy kullanırken hafif bir boşluk, ama çok daha küçük (yarım saniye kadar) vardı. Ama bu başka bir gün için bir hikaye olacak sanırım.

Sonuç:Tablo Değerli Parametreleri çok karmaşık ithalat dönüştürmek için BULK INSERT operasyon orta ölçekli işletme süreçleri daha iyi yapmak veri setleri.


Bir diğer nokta eklemek için, sadece pro-hazırlama-tablo Millet parçası üzerinde herhangi bir endişe yatıştırmak için istiyorum. Bir şekilde, tüm bu hizmeti dev bir hazırlama süreci. Sürecinin her aşamasında değiliz çok ağır denetlenmişgerekhazırlama bir tablo bazı özel birleştirme başarısız oldu nedenini belirlemek için pratikte neredeyse hiç olmaz rağmen). Tek yapmamız gereken hizmeti hata ayıklama bir bayrak ayarlanır ve hata sonu veya veritabanı yerine bir dosyaya veri dökümü.

Diğer bir deyişle, biz zaten fazlasıyla yeterli içeriden bilgi işlem ve gerek yok güvenliği bir basamak tablosu; tek nedeni vardı hazırlama bir tablo ilk yerdi önlemek için cezasını tüm INSERT UPDATE deyimleri, biz olurdu kullanın yoksa. Orijinal süreçte hazırlama veri sadece sürdürülebilirlik açısından/bakım hiçbir değeri ekledim saliseler için çalışma tablosunda her neyse yaşadı.

Da var unutmayındeğilTVPs BULK INSERT Her bir işlem yerini aldı. Bilgilerin büyük miktarda ile anlaşma falan verileri DB atmak dışında özel bir şey yapmak gerekmez birden fazla operasyon hala SqlBulkCopy kullanın.TVPs performans her derde deva olduğunu, ancak bu belirli bir örnek, ilk basamak ve son arasındaki dönüşümleri birleştirme karıştığı SqlBulkCopy üzerinde başarılı oldular ben demiyorum.

Bu yüzden siz sahipsiniz. Point en uygun bağlantıyı bulmak için TToni gider, ama diğer yanıtları da takdir ediyorum. Tekrar teşekkürler!

CEVAP
27 Ocak 2010, ÇARŞAMBA


Gerçekten IZLEMEK ile tecrübem yok, ancak MSDN BULK INSERT vs. güzel performans karşılaştırma grafiği here henüz yok.

TOPLU EKLEME daha yüksek bir Başlangıç maliyeti var, ama bundan sonra daha hızlı olduğunu söylüyorlar. Uzak istemci bir senaryoda onlar yaklaşık 1000 satır ("basit" server mantığı). için çizgi çizmek IZLEMEK kullanarak iyi olmalı derdim kendi açıklamasına bakılırsa. Performans varsa vur büyük ihtimalle önemsİzdİr ve mimari faydaları çok iyi görünüyor.

Edit: bir yan not sunucu-yerel dosya önlemek ve hala SqlBulkCopy nesnesini kullanarak toplu kopyalama kullanabilirsiniz. Bir DataTable sadece doldurmak ve ""SqlBulkCopy bir örneği.-Yöntem WriteToServer yedir Kullanımı kolay ve çok hızlı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GoProTutorials

    GoProTutoria

    18 NİSAN 2011
  • Jonnyriddlin1

    Jonnyriddlin

    4 Ocak 2007
  • SunsetTrance

    SunsetTrance

    20 EYLÜL 2008