Должен ли я использовать SSIS или многопоточное приложение C# для загрузки плоских файлов в базу данных?
-
02-07-2019 - |
Вопрос
В службах интеграции SQL Server (SSIS) есть возможность настроить соединение с плоским файлом, который может содержать миллионы записей, и перенести эти данные в базу данных SQL.Кроме того, этот процесс можно вызвать из приложения C#, указав и используя пространство имен Microsoft.SqlServer.Dts.Runtime.
Будет ли плоский файл с миллионами записей лучше всего запускаться с помощью SSIS, или коллектив «вы» предпочтет приложение С# с несколькими рабочими потоками (один для чтения и добавления строки в переменную, другой для записи из этой переменной в БД) и «материнский» класс, который управляет этими потоками?(в блоке разработчика два процессора)
Я видел эти данные(блог команды sql), утверждая, что для плоского файла с миллионом строк SSIS является самым быстрым:
Process Duration (ms)
-------------------- -------------
SSIS - FastParse ON 7322 ms
SSIS - FastParse OFF 8387 ms
Bulk Insert 10534 ms
OpenRowset 10687 ms
BCP 14922 ms
Что ты думаешь?
Решение
Я могу говорить только за себя и свой опыт.Я бы выбрал SSIS, поскольку это один из тех случаев, когда вы можете без необходимости заново изобретать велосипед.Это повторяющаяся задача, которая уже решена SSIS.
У меня около 57 рабочих мест (сочетание DTS и SSIS), которыми я управляю ежедневно.Четыре из них обычно экспортируют от 5 до 100 миллионов записей.База данных, которой я управляю, содержит около 2 миллиардов строк.Я использовал задачу-скрипт для добавления даты с точностью до миллисекунды, чтобы можно было запускать задания несколько раз в день.Делаю это уже около 22 месяцев.Это было здорово!
Задания SSIS также можно запланировать.Так что вы можете установить его и забыть.Я отслеживаю все каждый день, но часть обработки файлов ни разу не сломалась.
Единственный раз, когда мне приходилось прибегать к специальной программе на C#, это когда мне нужно было разделить очень большие файлы на более мелкие фрагменты.SSIS очень медленно справляется с такими вещами.Для разделения текстового файла объемом один гигабайт потребовалось около часа с использованием задачи сценария.Специальная программа C# справилась с этим за 12 минут.
В конце концов, просто используйте то, что вам удобно.
Другие советы
SSIS невероятно быстр.Кроме того, если что-то должно происходить неоднократно, вы можете настроить агент на его запуск по расписанию.Написать его самостоятельно — это одно, а попытаться сделать его многопоточным оказывается намного сложнее, чем кажется на первый взгляд.
Я бы рекомендовал SSIS в 9 случаях из десяти.
Я не понимаю, как использование нескольких потоков повысит производительность в этом случае.При передаче больших объемов данных основным узким местом обычно является дисковый ввод-вывод.Создание нескольких потоков не решит эту проблему, и я предполагаю, что это усугубит ситуацию, поскольку приведет к конфликту блокировок между несколькими процессами, обращающимися к базе данных.