Önerilen parti boyutu ne için SqlBulkCopy
? Performans ayarı için bir başlangıç noktası olarak kullanabileceğim genel bir formül arıyorum.
Önerilen parti boyutu ne için SqlBulkCopy
? Performans ayarı için bir başlangıç noktası olarak kullanabileceğim genel bir formül arıyorum.
Yanıtlar:
SQL Server örneğimle aynı fiziksel sunucuda oturan bir içe aktarma yardımcı programım var. Bir özel kullanarak IDataReader
, düz dosyaları ayrıştırır ve kullanarak bunları bir veritabanına ekler SQLBulkCopy
. Tipik bir dosyanın yaklaşık 6 milyon nitelikli satırı vardır, ortalama 5 sütun ondalık ve kısa metin, satır başına yaklaşık 30 bayttır.
Bu senaryo göz önüne alındığında, 5.000'lik bir parti boyutunu hız ve bellek tüketiminin en iyi uzlaşması olarak buldum. 500 ile başladım ve daha büyük olanı denedim. 5000'i, ortalama olarak 500'den 2,5 kat daha hızlı buldum. 6 milyon satırın eklenmesi, 5.000 toplu iş boyutunda yaklaşık 30 saniye ve 500 toplu iş boyutunda yaklaşık 80 saniye sürer.
10.000 ölçülecek kadar hızlı değildi. 50.000'e çıkmak, hızı birkaç yüzde puan artırdı, ancak sunucu üzerindeki artan yüke değmez. 50.000'in üzerinde hızda hiçbir gelişme görülmedi.
Bu bir formül değil, ancak kullanmanız gereken başka bir veri noktası.
Bu benim de biraz zaman harcadığım bir konu. Büyük CSV dosyalarını (16+ GB, 65+ milyon kayıt ve büyüyen) bir C # konsol uygulaması (.Net 2.0) kullanarak bir SQL Server 2005 veritabanına aktarmayı optimize etmek istiyorum. Jeremy'nin daha önce belirttiği gibi , özel koşullarınız için biraz ince ayar yapmanız gerekecek, ancak başlangıçta 500'lük bir parti boyutuna ve bunun hem üstünde hem de altında test değerlerine sahip olmanızı tavsiye ederim.
Bu MSDN forum gönderisinden toplu iş boyutu için 100 ile 1000 arasındaki değerleri test etme önerisini aldım ve şüpheliydim. Ancak 100 ile 10.000 arasındaki parti boyutlarını test ettiğimde, 500'ün uygulamam için en uygun değer olduğunu buldum. 500 değeri SqlBulkCopy.BatchSize
de burada önerilir .
SqlBulkCopy işleminizi daha da iyileştirmek için bu MSDN tavsiyesine bakın ; SqlBulkCopyOptions.TableLock kullanmanın yükleme süresini azaltmaya yardımcı olduğunu görüyorum.
Diğerlerinin de belirttiği gibi, ortamınıza, özellikle satır hacmine ve ağ gecikmesine bağlıdır.
Şahsen, BatchSize
özelliği 1000 satıra ayarlamakla başlayıp bunun nasıl performans gösterdiğini görüyorum. Çalışırsa, bir zaman aşımı alana kadar satır sayısını (örneğin 2000, 4000, vb.) İkiye katlamaya devam ederim.
Aksi takdirde, 1000'de bir zaman aşımı olursa, işe yarayana kadar satır sayısını yarı yarıya (örneğin 500) azaltırım.
Her durumda, tatlı bir nokta bulana kadar denenen son iki parti boyutunun her biri arasındaki farkı ikiye katlamaya (başarılıysa) veya yarıya indirmeye (başarısız olursa) devam ediyorum .
Dikkate alınması gereken diğer faktör, tek bir satır kümesini kopyalamanın ne kadar sürdüğüdür. Kopyalanan satır grubu, BulkCopyTimeout
varsayılan olarak 30 saniye olan özelliği aşarsa, zaman aşımı oluşur . BulkCopyTimeout
Özelliği ikiye katlayarak 60 saniyeye çıkarmayı deneyebilirsiniz . Bu, daha büyük bir toplu iş sırası kümesinin kopyalanması için daha uzun bir süre sağlar. Örneğin, 50.000 satırlık bir grup, 30 saniyelik süre sınırını aşarak yaklaşık 40 saniye sürebilir, bu nedenle 60 saniyeye kadar yükseltmek performansa yardımcı olabilir.
Bu tamamen uygulamanıza bağlıdır.
Ağınızda ne tür bir hız bekleyebilirsiniz? Formlar'da mı yoksa ASP.Net'te mi kullanıyorsunuz? Kullanıcıyı ilerleme konusunda uyarmanız gerekiyor mu? Toplam işin boyutu nedir?
Deneyimlerime göre, belirtilen bir toplu iş boyutu olmadan toplu kopyalama çalıştırmak zaman aşımı sorunlarına neden olacak. 1000 kayıt gibi bir şeyle başlamayı ve oradan bazı ayarlamalar yapmayı seviyorum.
birden fazla boyut denedim, benim durumumda 5000 iyiydi