Apa cara tercepat untuk mengekspor tabel ke file teks

17

Saya akan memiliki database SQL Server 2012 dan tabel dengan 3 juta baris dan mungkin 50 kolom. Apa yang akan menjadi cara tercepat untuk proses .net tanpa dijaga latar belakang (mungkin mengeluarkan beberapa perintah SQL atau Powershell) untuk mengekspornya ke file teks, satu baris untuk setiap baris data? Proses .net harus tahu kapan ekspor telah selesai atau jika ada kesalahan. Tipe data akan semua intatau nvarchar.

Saya mengasumsikan bahwa kode C # murni menggunakan ado.net untuk menjalankan select *perintah dan mengulang datareader dan menulis ke file untuk setiap catatan akan lambat dan tidak ada cara saya bisa memparalelkan ini.

Idealnya ekspor akan ke folder jaringan bersama jarak jauh dan bukan folder lokal pada mesin SQL Server. SQL Server akan menjadi cluster HA. Apakah SSIS lebih cocok untuk ini, tidak perlu transformasi data?

Proses .Net akan berjalan pada Mesin A, SQL Server pada Mesin B dan tujuan file akhir adalah berbagi jaringan. Salah satu opsi adalah SQL server menulis file langsung ke jaringan berbagi. Opsi lainnya adalah SQL Server menulis ke mesin A dan kemudian ketika file ditulis proses .net menyalinnya ke jaringan berbagi. Saya tidak memiliki SLA formal tetapi mengharapkan 30 menit - 1 jam untuk file tulis.

softveda
sumber
3
"Ideally the export will be to a remote shared network folder and not a local folder on the SQL Server machine."- dari mana aplikasi .NET dijalankan? Kasus terburuk, ini bisa berarti data harus bergerak melalui 2 jaringan hop, yang mungkin akan menjadi hambatan terbesar. Juga, jumlah baris agak tidak relevan - berapakah perkiraan ukuran total data? Apakah Anda memiliki SLA kinerja yang harus Anda penuhi untuk proses ini?
Jon Seigel

Jawaban:

10

Melongok melalui semua artikel tersebut adalah opsi jika Anda ingin menjadi tua menontonnya.

Beberapa opsi berbeda yang harus Anda coba adalah:

Dan Anda dapat mencoba semua opsi ini sambil mengulang di sesi lain, hanya untuk bersenang-senang :-).

Marian
sumber
4

Saya hanya akan menggunakan Wisaya Ekspor Impor. Pada akhirnya Anda diberi opsi untuk menyimpan tugas, yang kemudian dapat Anda jadwalkan dengan SQL Server Agent. Tambahkan diri Anda sebagai operator dan konfigurasikan DB Mail di server, dan itu dapat mengirim email kepada Anda ketika pekerjaan selesai atau gagal.

Serius, mengapa menciptakan kembali kemudi?

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

Bit Bacon
sumber
Tidak buruk sama sekali, sebenarnya ini menyimpan paket SSIS pada akhirnya. Jika hanya tugas satu kali saja, itu bisa menjadi solusi.
Marian
2

Yang lain telah menyatakan bahwa bcp harus menjadi cara tercepat tetapi saya tidak melihat adanya keuntungan dibandingkan solusi CLR. Pada sisipan ke tabel database, berbagai implementasi salinan massal akan selalu menang. Ini terutama karena cara mereka meminimalkan logging dan mengaktifkan penulisan multi-threaded. Anda tidak memiliki kendala ini saat menulis ke file datar.

Di tempat kerja saya, kami menggunakan CLR untuk membuang output permintaan ke file. Kami juga memasukkan Ionic.Zip.dll sehingga file tersebut dapat di-zip secara otomatis setelah dibuat.

Berikut ini adalah contoh yang diklaim oleh op dua kali lebih cepat dari bcp pada blob: /programming/10325338/fastest-way-to-export-blobs-from-table-into-individual-files

brian
sumber
Pertanyaan khusus itu tidak terlalu terperinci. Saya sarankan Anda membaca pertanyaan berikut - Mengoptimalkan kinerja BCP untuk data BLOB di sini. Ini pasti akan memberikan gambaran tentang banyak opsi bermain yang Anda miliki dengan BCP saja :-).
Marian
Saya melihat tautan dan sepenuhnya setuju. Tetapi sebagian besar poin optimasi adalah untuk memuat data ke server sql. Saya belum melihat fakta terkait bcp yang lebih cepat daripada streamwriter atau solusi CLR filestream saat menulis data sql ke file datar.
Brian
1

Anda dapat membuat paket SSIS sederhana:

Berikut cara tingkat tinggi:

  1. Buat koneksi OLEDB ke database di manajer koneksi
  2. Seret Transformasi Aliran Data ke Aliran Kontrol dan kemudian klik untuk mendapatkan aliran data.
  3. Seret Sumber OLEDB dari kotak alat ke dalam aliran data, dan edit sehingga terhubung ke tabel yang Anda inginkan menggunakan koneksi yang Anda buat pada langkah 1
  4. Seret Tujuan File Rata dari kotak alat ke dalam aliran data dan hubungkan sumber OLEDB ke sana.
  5. Pilih "Baru" di Tujuan File Flat, dan itu akan membuat file flat baru dengan struktur kolom yang sama, dan Anda dapat menggunakan pembatas yang Anda inginkan, atau mungkin diperbaiki dengan file jika Anda suka.
  6. Menjalankannya.

Noob mana pun harus bisa memikirkan hal ini. Orang Anti-GUI tidak akan menyukai solusi ini, jadi simpan komentar tentang hal itu, itu hanya sebuah alternatif untuk individu yang kurang teknologi yang berjuang menggunakan BCP ...

Anda memiliki sedikit lebih banyak fleksibilitas dalam bagaimana file data diformat. Anda dapat melakukan ini di BCP dan semua itu, tetapi ini menghilangkan kompleksitas darinya. Tetapi ada keuntungan kecil karena Anda dapat memasukkan header file khusus, dan membuat "Nama Kolom" sebagai baris pertama, yang membuat file flat lebih dapat dikonsumsi manusia.

Jangan lupa untuk menyimpannya, jika Anda membuatnya sekali, Anda kemungkinan akan ditanya lagi! Semoga ini membantu..

Chef Slagle
sumber
0

Saya pikir bcp.exe dari commandline harus menjadi cara tercepat.

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

bummi
sumber
5
Meskipun Anda mungkin benar, dapatkah Anda menjelaskan tentang solusi ini? Cara penggunaannya (tautan ke dokumen mungkin cukup), mengapa menurut Anda lebih cepat dll.
dezso