Bir tabloyu bir metin dosyasına aktarmanın en hızlı yolu nedir


17

Bir SQL Server 2012 veritabanı ve 3 milyon satır ve belki de 50 sütun içeren bir tablo olacak. Katılımsız bir arka plan .net işleminin (belki de bazı SQL veya Powershell komutlarını verir) bir metin dosyasına, her veri satırı için bir satır dışa aktarmanın en hızlı yolu nedir? .Net işlemi dışa aktarmanın ne zaman tamamlandığını veya herhangi bir hata olup olmadığını bilmelidir. Veri türü tümü intveya olacaktır nvarchar.

Bir select *komut yürütmek ve datareader üzerinde döngü ve her kayıt için bir dosyaya yazma için saf bir C # kodu yavaş olacağını varsayalım ve bunu paralel olabilir hiçbir yolu yoktur.

İdeal olarak dışa aktarma, SQL Server makinesindeki yerel bir klasöre değil, uzak bir paylaşılan ağ klasörüne yapılacaktır. SQL Server bir HA kümesi olacaktır. SSIS bunun için daha uygun mudur, veri dönüşümü gerekmez mi?

.Net işlemi, Makine A, Makine B üzerindeki SQL Server üzerinde çalışacak ve nihai dosya hedefi bir ağ paylaşımı olacaktır. Bir seçenek SQL sunucusunun dosyayı doğrudan ağ paylaşımına yazmasıdır. Diğer seçenek, SQL Server'ın A makinesine yazması ve ardından dosya yazıldığında .net işleminin ağ paylaşımına kopyalamasıdır. Ben resmi SLA yok ama dosya yazma için 1 saat - 30 dakika bekliyor.


3
"Ideally the export will be to a remote shared network folder and not a local folder on the SQL Server machine."- .NET uygulaması nereden çalışacak? En kötü ihtimalle, bu, verilerin muhtemelen en büyük darboğaz olacak 2 ağ şeridi boyunca hareket etmesi gerektiği anlamına gelebilir. Ayrıca, satır sayısı biraz alakasız - yaklaşık toplam veri boyutu nedir? Bu işlem için karşılamanız gereken bir performans SLA'nız var mı?
Jon Seigel

Yanıtlar:


10

Eğer eski izlerken yürütmek istiyorsanız tüm bu makaleler arasında döngü bir seçenektir.

Denemeniz gereken bazı farklı seçenekler şunlardır:

Ve sadece eğlenmek için başka bir oturumda döngü yaparken tüm bu seçenekleri deneyebilirsiniz :-).


4

Sadece Verme Alma Sihirbazı'nı kullanırdım. Sonunda görevi kaydetme seçeneği sunulur, böylece SQL Server Agent ile zamanlayabilirsiniz. Kendinizi bir operatör olarak ekleyin ve sunucuda DB Mail'i yapılandırın ve iş tamamlandığında veya başarısız olduğunda size e-posta gönderebilir.

Cidden, tekerleği neden yeniden icat ettiniz?

http://msdn.microsoft.com/en-us/library/ms140052.aspx


Hiç fena değil, aslında bu sonunda bir SSIS paketi kaydeder. Tek seferlik bir görevse, bir çözüm olabilir.
Marian

2

Diğerleri, BCP'nin en hızlı yol olması gerektiğini belirtti ancak CLR çözümüne göre hiçbir avantaj göremiyorum. Veritabanı tablolarına eklerde, çeşitli toplu kopya uygulamaları her zaman kazanacaktır. Bunun başlıca nedeni, günlüğe kaydetmeyi en aza indirme ve çok iş parçacıklı yazma işlemlerini etkinleştirme biçimidir. Düz bir dosyaya yazarken bu kısıtlamalara sahip değilsiniz.

İşimde, sorgu çıktısını bir dosyaya dökmek için bir CLR kullanıyoruz. Biz de dahil Ionic.Zip.dll dosyası otomatik oluşturulduktan sonra sıkıştırılmış böylece.

İşte op'un lekelerde bcp'nin iki katı kadar hızlı olduğunu iddia ettiği bir örnek: /programming/10325338/fastest-way-to-export-blobs-from-table-into-individual-files


Bu özel soru çok detaylı değil. Aşağıdaki soruyu okumanızı öneririm - BLOB verileri için BCP performansını optimize etme . Sadece BCP ile sahip olduğunuz birçok oyun seçeneği hakkında bir fikir verecektir.
Marian

Bağlantıları görüyorum ve tamamen katılıyorum. Ancak optimizasyon noktalarının çoğu sql sunucusuna veri yüklemek içindir. Bcp ile ilgili herhangi bir gerçek henüz düz bir dosyaya sql veri yazarken bir streamwriter veya filestream CLR çözüm daha hızlı görmedim.
brian

1

Basit bir SSIS paketi oluşturabilirsiniz:

İşte üst düzey bir:

  1. Bağlantı yöneticisinde veritabanına OLEDB bağlantısı oluşturma
  2. Bir Veri Akışı Dönüşümünü Kontrol Akışına sürükleyin ve ardından veri akışına ulaşmak için üzerine tıklayın.
  3. Bir OLEDB Kaynağını araç kutusundan veri akışına sürükleyin ve 1. adımda oluşturduğunuz bağlantıyı kullanarak istediğiniz tabloya bağlanacak şekilde düzenleyin
  4. Araç kutusundan bir Düz Dosya Hedefini veri akışına sürükleyin ve OLEDB kaynağını buna bağlayın.
  5. Düz Dosya Hedefinde "Yeni" yi seçin, aynı sütun yapısına sahip yeni bir düz dosya oluşturur ve istediğiniz sınırlayıcıyı veya isterseniz dosyayla sabitleyebilirsiniz.
  6. Çalıştır.

Herhangi bir çaylak bunu çözebilmelidir. Bir Anti-GUI personeli bu çözümü sevmez, bu nedenle bu konudaki yorumları kaydedin, BCP kullanarak mücadele eden daha az teknoloji meraklısı bireyler için bir alternatif ...

Veri dosyasının biçimlendirilmesinde biraz daha esnekliğiniz var. Bunu BCP'de ve her şeyde yapabilirsiniz, ancak bu karmaşıklığı ortadan kaldırır. Ancak, özel bir dosya üstbilgisine koyabileceğiniz ve ilk satır olarak bir "Sütun Adı" oluşturabileceğiniz için küçük bir avantaj vardır, bu da düz dosyayı daha insan sarf edilebilir hale getirir.

Kaydetmeyi unutmayın, bir kez oluşturduysanız, muhtemelen tekrar sorulacak! Bu yardımcı olur umarım..


0

Bence komut satırından bcp.exe en hızlı yolu olmalıdır.

http://msdn.microsoft.com/en-us/library/ms162802.aspx


5
Haklı olmanıza rağmen, bu çözüm hakkındaki ayrıntılara biraz ışık tutabilir misiniz? Nasıl kullanılır (dokümanlar için bir bağlantı yeterli olabilir), neden daha hızlı olduğunu düşünüyorsunuz
dezso
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.