Загрузить массив CSV-файл в базу данных SQL Server - PullRequest
7 голосов
/ 12 мая 2009

Мне нужно загрузить массивный (16 ГБ, более 65 миллионов записей) CSV-файл в одну таблицу в базе данных SQL Server 2005. У кого-нибудь есть указания на лучший способ сделать это?

Детали

В настоящее время я использую консольное приложение C # (.NET Framework 2.0), чтобы разбить файл импорта на файлы по 50000 записей, а затем обработать каждый файл. Я загружаю записи в базу данных из консольного приложения, используя класс SqlBulkCopy, порциями по 5000. Для разделения файлов требуется примерно 30 минут, а для загрузки всего набора данных (более 65 миллионов записей) - примерно 4,5 часа. Сгенерированный размер файла и размер пакетной загрузки являются настройками конфигурации, и я изучаю возможность увеличения их значения для повышения производительности. Для запуска приложения мы используем четырехъядерный сервер с 16 ГБ оперативной памяти. Этот сервер также является сервером базы данных.

Обновление

Учитывая ответы на данный момент, обратите внимание, что до импорта:

  • Таблица базы данных усекается, а все индексы и ограничения удаляются.
  • База данных сжата, а дисковое пространство восстановлено.

После завершения импорта:

  • Индексы воссозданы

Если вы можете предложить какие-либо другие подходы или способы улучшения существующего приложения импорта, я был бы признателен. Спасибо.

Смежный вопрос

Следующий вопрос может быть полезен для других, имеющих дело с этой проблемой:

Решение

Я исследовал влияние изменения размера пакета и размера разделенных файлов и обнаружил, что пакеты из 500 записей и разделенные файлы из 200 000 записей лучше всего подходят для моего приложения. Использование SqlBulkCopyOptions.TableLock также помогло. См. Ответ на этот вопрос для получения более подробной информации.

Я также рассмотрел использование пакета служб SSIS DTS и сценария BULK INSERT SQL. Пакет служб SSIS появился быстрее, но не дал мне возможности записывать недействительные записи и т. Д. SQL-скрипт BULK INSERT, хотя и медленнее, чем пакет служб SSIS, был значительно быстрее, чем приложение C #. Это позволило мне записывать ошибки и т. Д., И по этой причине я принимаю BULK INSERT ответ от ConcernedOfTunbridgeWells в качестве решения. Я знаю, что это может быть не лучшим ответом для всех, кто сталкивается с этой проблемой, но это отвечает моей непосредственной проблеме.

Спасибо всем, кто ответил.

С уважением, MagicAndi

Ответы [ 11 ]

0 голосов
/ 12 мая 2009

Вы пытались использовать метод Массовая вставка в Sql Server?

...