Загрузите крупный файл CSV на базу данных SQL Server

Решение состоит в том, чтобы программно вводить аргументы командной строки. Перед возвратом бегуна вставьте следующие строки:

process.argv.push('--foo=bar');
process.argv.push('--yo');

В тестовых файлах используйте minimist, чтобы получить свои пользовательские параметры.

Ваш вопрос также относится к этому

.

7
задан Community 23 May 2017 в 11:46
поделиться

11 ответов

BULK INSERT запускается из самой СУБД, считывая файлы, описываемые файлом управления bcp, из каталога на сервере (или смонтированного на нем). Напишите приложение, которое разбивает файл на более мелкие части, помещает их в соответствующий каталог, выполняет оболочку, которая выполняет серию BULK INSERTS . При необходимости вы можете запустить несколько потоков параллельно.

Вероятно, это примерно так же быстро, как при массовой загрузке. Кроме того, если в файле массовой загрузки доступен подходящий ключ разделения, поместите промежуточную таблицу в схему разделения.

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

5
ответ дан 6 December 2019 в 19:41
поделиться

Вы пробовали SSIS (службы интеграции SQL Server).

3
ответ дан 6 December 2019 в 19:41
поделиться

Класс SqlBulkCopy , который вы уже используете, будет вашим лучшим выбором. Лучшее, что вы можете сделать здесь в своем коде C #, - это поэкспериментировать с вашей конкретной системой и данными, чтобы увидеть, какие размеры пакетов работают лучше всего. Но вы уже это делаете.

Выходя за рамки клиентского кода, вы можете кое-что сделать с сервером, чтобы сделать импорт более эффективным:

  • Попробуйте установить размер таблицы и базы данных перед началом импорта к чему-то достаточно большому, чтобы вместить весь набор. Вы не хотите полагаться на автоматическое увеличение в середине этого.

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

  • Наконец, это ' Заманчиво попробовать запустить это параллельно, когда несколько потоков будут выполнять массовую вставку одновременно. Однако самым большим узким местом почти наверняка является производительность диска. Все, что вы можете сделать с физическим сервером для его улучшения (новые диски, san и т. Д.), Поможет гораздо больше.

2
ответ дан 6 December 2019 в 19:41
поделиться

Пробовали ли вы использовать метод Bulk Insert ] на сервере Sql?

0
ответ дан 6 December 2019 в 19:41
поделиться

Вы можете сохранить шаг разделения файлов следующим образом:

  • Создайте экземпляр IDataReader для чтения значений из входного файла CSV. Есть несколько способов сделать это: самый простой, вероятно, - использовать драйвер Microsoft OleDb Jet. Google для этого, если вам нужна дополнительная информация - например, есть некоторая информация в этот вопрос StackOverflow .

    Альтернативный метод - использовать метод, подобный тому, который используется в www.csvreader.com .

  • Создайте экземпляр объекта SqlBulkCopy, установите для свойств BatchSize и BulkCopyTimeout соответствующие значения.

  • Передайте IDataReader методу SqlBulkCopy.WriteToServer.

Я успешно использовал этот метод с большими файлами, но не такими большими, как ваша.

2
ответ дан 6 December 2019 в 19:41
поделиться

В последнее время мне также приходилось загружать / импортировать много вещей (построил скрипт PHP).

Я решил обработать их по принципу «запись в запись».

Конечно, , это занимает больше времени, но для меня были важны следующие моменты: - легко приостановить процесс - улучшенная отладка

Это всего лишь совет.

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

0
ответ дан 6 December 2019 в 19:41
поделиться

See this and this blog posts for a comparison. It seems the best alternative is to use BulkInsert with the TABLOCK option set to true.

1
ответ дан 6 December 2019 в 19:41
поделиться

BULK INSERT , вероятно, уже самый быстрый способ. Вы можете получить дополнительную производительность, удалив индексы и ограничения, вставляя и повторно устанавливая их позже. Наибольшее влияние на производительность оказывают кластерные индексы.

0
ответ дан 6 December 2019 в 19:41
поделиться

Вы пробовали использовать для этого службы интеграции SQL Server? Возможно, будет лучше обработать такой большой текстовый файл

0
ответ дан 6 December 2019 в 19:41
поделиться

Просто для проверки, ваша вставка будет быстрее, если в таблице, в которую вы вставляете, нет индексов.

0
ответ дан 6 December 2019 в 19:41
поделиться

Мой сценарий для подобных вещей: Создайте пакет SSIS на сервере SQL, который с помощью BLUK вставляет в sql, Создайте хранимую процедуру внутри базы данных для запуска этого пакета из кода T-SQL

После этого отправьте файл для вставки bluk на сервер SQL с помощью FTP и вызовите хранимую процедуру usinfg пакета SSIS

0
ответ дан 6 December 2019 в 19:41
поделиться