Самый быстрый и лучший способ для импорта содержимого файла в базу данных - PullRequest
2 голосов
/ 04 апреля 2011

У меня есть папки, в которые ежедневно поступает около 3000 новых CSV-файлов, каждая из которых содержит от 50 до 2000 строк информации.

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

Это означает, что в течение дня может быть сложно пройти через 3000 файлов, прежде чем появятся следующие 3000!

Я стремлюсь улучшить этот процесс, и у меня были следующие идеи

  • Используйте новую функцию Parallel в C # 4.0, чтобы разрешить одновременную обработку нескольких файлов, по-прежнему проходя по строкам одну за другой в сохраненный процесс
  • Создать новую временную таблицу базы данных, в которую можно сразу вставить все строки в файле, а затем вызвать хранимую процедуру для вновь добавленных строк в временной таблице.
  • Разделите процесс на 2 задачи. Одно задание для чтения данных из файлов во временную таблицу базы данных, другое для обработки строк во временной таблице.

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

Ответы [ 4 ]

3 голосов
/ 04 апреля 2011

Массовая вставка SQL Server может быть именно тем, что вам нужно

http://msdn.microsoft.com/en-us/library/ms188365.aspx

Еще одна проблема, которую вы можете наблюдать, когда все эти вставки занимают много времени, - каждый раз, когда добавляется строка, ваша таблица может переиндексироваться. Такой поиск даст много хороших статей о том, как, возможно, получить лучшую производительность от вашей текущей процедуры http://www.google.com/search?q=sql+insert+performance

1 голос
/ 04 апреля 2011

Предположим, что все 3000 импортируемых файлов имеют по 2000 строк каждый.Это 6 миллионов строк в день.Узкое место может быть не в том, что клиент делает вставки, а в самой базе данных.Если индексы включены в рассматриваемой таблице (таблицах), вставки могут быть медленными, в зависимости от того, насколько индексированы эти таблицы.Какие признаки привели вас к выводу, что это база данных, которая ждет, чтобы что-то сделать, и что это процедура импорта, которая отстает, а не наоборот?

1 голос
/ 04 апреля 2011

Вы можете использовать собственную утилиту BCP для SQL Server.

Более подробную информацию об утилите BCP можно найти здесь: Импорт и экспорт групповых данных с помощью утилиты bcp

Вы также можете взглянуть на: Об операциях массового импорта и массового экспорта

0 голосов
/ 04 апреля 2011

Вы сказали

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

(выделение добавлено.)

Кажется, что одна строка равна одной транзакции .

Исправьте это.

  • Предварительно обработайте файлы, чтобы они были приемлемы для массовой загрузки.
  • Предварительно обработайте файлы, чтобы они сформировали допустимые операторы SQL INSERT, и загрузите ихсюда.(В одной транзакции.)

Я полагаю, что оба из них звучат как "заменить хранимую процедуру".Но реальная цель - уменьшить количество транзакций.Любой из этих вариантов позволит сократить количество транзакций для этого процесса с 6 миллионов в день (в худшем случае) до 3000 в день.

...