Який найшвидший спосіб експорту таблиці в текстовий файл


17

У мене буде база даних SQL Server 2012 і таблиця з 3 мільйонами рядків і, можливо, 50 стовпців. Що буде найшвидшим способом для безперервного фонового процесу .net (можливо, видає якусь команду SQL або Powershell), щоб експортувати його в текстовий файл, по одному рядку для кожного рядка даних? Процес .net повинен знати, коли експортування було завершено або чи була помилка. Тип даних буде всім intабо nvarchar.

Я припускаю, що чистий код C #, що використовує ado.net для виконання select *команди та перенесення циклічного перечитника даних та запис у файл для кожного запису, буде повільним, і я не можу паралелізувати це.

В ідеалі експорт буде у віддалену загальну мережеву папку, а не в локальну папку на машині SQL Server. SQL Server буде кластером HA. Чи краще для цього підходить SSIS, не потрібна трансформація даних?

Процес .Net запускається на машині A, SQL Server на машині B, а кінцеве призначення файлу - це мережева частка. Один з варіантів - SQL-сервер записує файл безпосередньо в мережеву спільну доступність. Інший варіант - SQL Server записує на машину A, а потім, коли файл записується, .net-процес копіює його в мережу. У мене немає офіційного угоди про угод, але очікую 30 хвилин - 1 год для запису файлу.


3
"Ideally the export will be to a remote shared network folder and not a local folder on the SQL Server machine."- звідки буде працювати програма .NET? Найгірше, це може означати, що дані мають переміщатися через 2 мережеві стрибки, що, мабуть, буде найбільшим вузьким місцем. Також кількість рядків дещо не має значення - який приблизний загальний розмір даних? Чи є у вас домовленості про рівень обслуговування, які потрібно зустріти для цього процесу?
Джон Сейгель

Відповіді:


10

Перегляд усіх цих статей - це варіант, якщо ви хочете постаріти, переглядаючи його виконання.

Деякі різні варіанти, які ви повинні спробувати:

І ви можете спробувати всі ці параметри під час циклу в іншому сеансі, просто для розваги :-).


4

Я б просто скористався майстром імпорту експорту. Наприкінці вам надається можливість зберегти завдання, яке ви зможете запланувати за допомогою агента SQL Server. Додайте себе в якості оператора і налаштуйте DB Mail на сервері, і він може надіслати вам електронну пошту, коли завдання буде завершено або завершено.

Серйозно, навіщо винаходити колесо?

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


Зовсім непогано, адже це економить пакет SSIS наприкінці. Якщо це разова задача, це може бути рішенням.
Маріан

2

Інші заявили, що bcp має бути найшвидшим способом, але я не бачу жодної переваги перед рішенням CLR. На вставках до таблиць баз даних завжди будуть вигравати різні реалізації масової копії. В першу чергу це пов'язано з тим, як вони мінімізують ведення журналів і включають багатопотокові записи. У вас немає цих обмежень під час запису в плоский файл.

У своїй роботі ми використовуємо CLR, щоб скинути вихідний запит у файл. Ми також включаємо Ionic.Zip.dll, щоб файл міг автоматично створюватись в папці після створення.

Ось приклад, за яким операційна система стверджує, що вдвічі швидша, ніж bcp на краплі: /programming/10325338/fastest-way-to-export-blobs-from-table-into-individual-files


Саме конкретне питання не дуже детальне. Я б запропонував вам прочитати наступне питання - Оптимізація продуктивності BCP для даних BLOB тут. Це, безумовно, дасть уявлення про багато варіантів гри, які ви маєте лише з BCP :-).
Маріан

Я бачу посилання і повністю згоден. Але більшість точок оптимізації призначені для завантаження даних на сервер sql. Я ще не бачив жодних фактів, пов’язаних з тим, щоб bcp був швидшим, ніж протокол CLR в потоковому редакторі або файловий потік, коли записувати дані sql у плоский файл.
Брайан

1

Ви можете створити простий пакет SSIS:

Ось як на високому рівні:

  1. Створіть підключення OLEDB до бази даних в диспетчері з'єднань
  2. Перетягніть перетворення потоку даних у контрольний потік, а потім натисніть на нього, щоб перейти до потоку даних.
  3. Перетягніть джерело OLEDB з панелі інструментів у потік даних та відредагуйте його, щоб він підключився до потрібної таблиці за допомогою з'єднання, створеного на кроці 1
  4. Перетягніть цільове місце призначення файлу з панелі інструментів у потік даних та підключіть до нього джерело OLEDB.
  5. Виберіть "Нове" у пункті призначення "Плоский файл", і він створить новий плоский файл з тією ж структурою стовпця, і ви можете використовувати потрібний роздільник, або, можливо, фіксований файл, якщо вам це подобається.
  6. Виконати його.

Будь-яка новачка повинна це вміти розібратися. Особі, яка не користується програмою GUI, не сподобається це рішення, тому збережіть коментарі з цього приводу, це просто альтернатива для менш технічних кмітливих людей, які борються за допомогою BCP ...

Ви маєте трохи більше гнучкості у форматуванні файлу даних. Це можна зробити на БКП і все це, але це виймає складність з цього. Але є невелика перевага, оскільки ви можете помістити в спеціальний заголовок файлу та створити "Ім'я стовпця" як перший рядок, що робить плоский файл більш споживчим.

Не забудьте зберегти його, якщо ви створили його один раз, вас, ймовірно, знову запитають! Сподіваюся, це допомагає ..


0

Я думаю, що bcp.exe з командної лінії повинен бути найшвидшим способом.

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


5
Хоча ти можеш мати рацію, ти можеш пролити трохи інформації про це рішення? Як його використовувати (посилання на документи може бути достатньо), чому ви вважаєте, що це швидше і т.д.
dezso
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.