У меня будет база данных 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 час для записи файла.
источник
"Ideally the export will be to a remote shared network folder and not a local folder on the SQL Server machine."
- откуда будет работать приложение .NET? В худшем случае это может означать, что данные должны проходить через 2 сетевых перехода, что, вероятно, станет самым большим узким местом. Кроме того, количество строк несколько не имеет значения - каков приблизительный общий размер данных? У вас есть соглашение об уровне обслуживания, которое вам нужно для этого процесса?Ответы:
Цикл по всем этим статьям - вариант, если вы хотите стареть, наблюдая за его выполнением.
Некоторые различные варианты, которые вы должны попробовать:
И вы можете попробовать все эти варианты во время цикла в другой сессии, просто для удовольствия :-).
источник
Я бы просто использовал Мастер импорта экспорта. В конце вы получаете возможность сохранить задачу, которую затем можно запланировать с помощью агента SQL Server. Добавьте себя в качестве оператора и настройте DB Mail на сервере, и он может отправить вам электронное письмо, когда задание будет выполнено или не выполнено.
Серьезно, зачем изобретать велосипед?
http://msdn.microsoft.com/en-us/library/ms140052.aspx
источник
Другие заявили, что bcp должен быть самым быстрым способом, но я не вижу никакого преимущества перед решением CLR. При вставках в таблицы базы данных различные реализации массовых копий будут всегда выигрывать. Это в первую очередь связано с тем, что они минимизируют ведение журналов и обеспечивают многопоточную запись. У вас нет этих ограничений при записи в плоский файл.
В моей работе мы используем CLR для вывода вывода запроса в файл. Мы также включили Ionic.Zip.dll, чтобы файл мог автоматически архивироваться после создания.
Вот пример, который оп заявляет, что он в два раза быстрее, чем bcp для больших двоичных объектов: /programming/10325338/fastest-way-to-export-blobs-from-table-into-individual-files
источник
Вы можете создать простой пакет служб SSIS:
Вот высокий уровень, как:
Любой нуб должен уметь это понять. Специалисту по анти-графическому интерфейсу не понравится это решение, поэтому сохраните комментарии на этот счет, это просто альтернатива для тех, кто не очень разбирается в технологиях и борется с использованием BCP ...
У вас есть немного больше гибкости в том, как форматируется файл данных. Вы можете сделать это в BCP и все такое, но это снимает сложность. Но есть небольшое преимущество, поскольку вы можете вставить собственный заголовок файла и создать «Имя столбца» в качестве первой строки, что делает плоский файл более удобным для человека.
Не забудьте сохранить его, если вы создали его один раз, вас, скорее всего, спросят снова! Надеюсь это поможет..
источник
Я думаю, что bcp.exe из командной строки должен быть самым быстрым способом.
http://msdn.microsoft.com/en-us/library/ms162802.aspx
источник