У меня есть файл журнала размером 248 МБ, который может увеличиваться до ГБ. Итак, вы можете себе представить, сколько строк может быть. Мне нужно импортировать все строки в таблицу в базе данных SQL Server. Для этого я сначала создаю DataTable и добавляю все строки в файле журнала в этот DataTable как новые строки. Это происходит довольно быстро. Примерно за 30 секунд в таблицу добавляется более миллиона записей. После того, как таблица заполнена строками, я импортирую записи в DataTable в базу данных, используя хранимую процедуру. Однако эта фаза выполняется очень тяжело. Теперь мне интересно, следует ли мне вместо этого использовать метод SqlBulkCopy WriteToServer или мне следует придерживаться этого пути? Если SqlBulkCopy является лучшим выбором, следует ли использовать версию DataTable или IDataReader. Заранее спасибо.
Должен ли я использовать SqlBulkCopy или хранимую процедуру для импорта данных
Ответы (1)
Я бы использовал SqlBulkCopy для импорта данных любого реального объема, подобного этому. Разница в производительности по сравнению с SqlDataAdapter может быть большой. например Я записал в блог для сравнения производительности для импорта 100 тыс. строк:
SqlBulkCopy: 1,5885 с
SqlDataAdapter: 25,0729 с
Вы можете получить еще большую пропускную способность, если используете параметр TableLock с SqlBulkCopy, который в моем тесте сократил импорт до 0,8229 с.
Также стоит отметить, что с помощью SqlBulkCopy вы можете иметь несколько экземпляров, которые параллельно загружают сегмент данных в одну и ту же целевую таблицу, не конкурируя друг с другом. Приносим извинения за другую внешнюю ссылку , но я думаю, что это актуально. Речь идет о загрузке в таблицу кучи, без индексов, для оптимальной производительности, что может не подойти для вашего текущего сценария, но о нем определенно стоит знать.