Какой самый быстрый способ экспортировать таблицу в текстовый файл


17

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

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

В идеале экспорт должен осуществляться в удаленную общую сетевую папку, а не в локальную папку на компьютере с SQL Server. SQL Server будет кластером высокой доступности. Подходит ли для этого SSIS, преобразование данных не требуется?

Процесс .Net будет выполняться на компьютере A, SQL Server на компьютере B, а конечным пунктом назначения файла является сетевой ресурс. Одним из вариантов является то, что SQL-сервер записывает файл непосредственно в общий сетевой ресурс. Другой вариант - SQL Server выполняет запись на компьютер A, а затем, когда файл записывается, процесс .net копирует его в общий сетевой ресурс. У меня нет официального SLA, но я ожидаю 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. Если это единовременная задача, это может быть решением.
Marian

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. Запустить его.

Любой нуб должен уметь это понять. Специалисту по анти-графическому интерфейсу не понравится это решение, поэтому сохраните комментарии на этот счет, это просто альтернатива для тех, кто не очень разбирается в технологиях и борется с использованием BCP ...

У вас есть немного больше гибкости в том, как форматируется файл данных. Вы можете сделать это в 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.