Мне нужно загрузить массивный (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