2013-06-13 4 views
3

От одного из наших партнеров я получаю около 10.000 небольших текстовых файлов с разделителями табуляции с +/- 30 записями в каждом файле. Им невозможно доставить его в один большой файл.Обработка SSIS большого количества плоских файлов болезненно медленна

Я обрабатываю эти файлы в контейнере цикла ForEach. После прочтения файла выполняются 4 вывода столбцов, а затем окончательное содержимое сохраняется в таблице SQL Server 2012.

Этот процесс может занять до двух часов.

Я уже пробовал обрабатывать небольшие файлы в один большой файл, а затем импортировал его в ту же таблицу. Этот процесс занимает еще больше времени.

У кого-нибудь есть предложения по ускорению обработки?

+2

Ваш пакет выглядит как цикл Foreach. Внутри цикла Foreach у вас есть задача потока данных. Задача потока данных имеет источник плоского файла. Преобразование производного столбца подключается к файлу с плоским файлом. Затем у вас есть (OLE DB Destination или SQL Server Destination), связанное с преобразованием Derived Column Transformation? Если вы используете назначение OLE DB, как он настроен? Вы пишете таблицу SQL Server 2012, но сам пакет является пакетом 2012 года или предыдущей версией? Делают ли пакеты на том же сервере, на котором находятся файлы, и является ли он тем же сервером, что и таблица назначения? – billinkc

+0

Убедитесь, что вы используете Open Rowset, используя параметр FastLoad в потоке данных назначения. Это может значительно ускорить процесс загрузки. Это поможет больше, если вы объедините файлы вместе. –

+0

Да, в контейнере ForEach: Flat File Source -> Derivation -> OLE DB Destination. Пункт назначения сконфигурирован с отключенным «Столблок», режим доступа к данным = «Быстрая загрузка» и «Проверить ограничения» не отмечены. Сам пакет составляет 2012 год и хранится на SQL Server. У меня нет доступа к файлам на SQL Server, поэтому исходные файлы хранятся на другом сервере. – user2482329

ответ

0

Сделайте ли ваши файлы легким способом (т. Е. Их имена), разделяя их на четные (или в основном четные) группы? Если это так, вы можете запускать свои нагрузки параллельно.

Например, предположим, что вы можете разделить их на 4 группы по 2500 файлов каждый.

  1. Создайте контейнер для каждой точки для каждой группы.
  2. Для вашего адресата для каждой группы напишите свои записи в их собственную промежуточную таблицу.
  3. Соедините все записи со всех промежуточных столов в своей большой таблице в конце.

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

+0

Спасибо, Кайл. Имя файла для каждого файла включает месяц и год. Я уже разделил файлы на месяц, оставив около 1500 файлов в папке. Мне удалось ускорить процесс, изменив настройки «Строки за пакет» и «Максимальный размер фиксации вставки» в Destination Ole DB. Для обработки файлов требуется около 1 часа (необработанная оценка, так как она все еще обрабатывается, когда мы говорим). – user2482329

+1

Если у каждого файла есть ~ 30 строк, то маловероятно, что изменение «Рядов за партию» будет много для вас Вероятно, все уже было сделано как одна партия. – mattmasson

2

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

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

  • Сетевой интерфейс/Текущая Bandwidth
  • Network Interface/Всего байт/сек
  • Network Interface/Передачи/сек

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

+1

Разделение работы на несколько преобразований только повышает производительность, если у вас есть несколько буферов данных. Если я читаю исходное сообщение правильно, он имеет дело только с 30 строками в файле, который всегда будет входить в один буфер. – mattmasson

+4

Проклятие вы @mattmasson и ваши превосходные знания SSIS! – billinkc

Смежные вопросы