Как сделать этот сценарий SSIS более параллельным

StackOverflow https://stackoverflow.com/questions/415427

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть миллион строк в таблице базы данных. Для каждой строки мне нужно запустить собственный exe-файл, проанализировать вывод и обновить другую таблицу базы данных

Как я могу параллельно обрабатывать несколько строк?

Теперь у меня есть простая задача потока данных -> GetData -> Выполнить скрипт (Выполнить процесс, проанализировать вывод) -> Сохранить данные Для 6000 строк это заняло 3 часа. Слишком много.

Это было полезно?

Решение

Здесь есть единственное узкое место, запускающее процесс для каждой строки. Увеличение " EngineThreads " не поможет, так как в любом случае будет только один поток, выполняющий преобразование этого сценария. Время, проведенное в других преобразованиях, вероятно, не имеет значения вообще. Процессы - это тяжелые объекты, и их запуск в тысячи раз никогда не будет дешевым.

Я могу придумать следующие идеи, чтобы сделать его лучше:

1) Лучший способ исправить это - преобразовать ваш собственный EXE-файл в сборку и вызвать его из сценария transform - чтобы избежать накладных расходов на создание процессов, анализ выходных данных и т. д.

2) Если вам нужно использовать отдельные процессы, вы можете попытаться запустить эти процессы параллельно. Это поможет, если процесс в основном ожидает некоторого ввода / вывода (то есть он связан с вводом / выводом). Если процессы связаны с памятью или центральным процессором, вы не выиграете много, запустив их параллельно.

2A) Сложный скрипт, простой пакет.

Чтобы запустить их параллельно, измените метод ProcessInput в вашем скрипте, чтобы запускать процесс асинхронно, и не ждите завершения процесса - перейдите к следующей строке и создайте следующий процесс. Подпишитесь, чтобы обработать вывод и обработать событие Exited, чтобы вы знали, когда оно закончилось. Ограничьте количество процессов, запущенных параллельно, иначе у вас не хватит памяти. Дождитесь завершения всех процессов, прежде чем вернуться из вызова ProcessInput.

2B) Простой скрипт, сложный пакет.

Сохраните текущий последовательный сценарий, но разделите данные с помощью служб SSIS. Добавьте преобразование с условным разделением и разделите входной поток на несколько потоков, основываясь на некотором хэш-выражении - то, что заставит каждый выход получать примерно одинаковый объем данных. Количество потоков равно количеству экземпляров процесса, которые вы хотите запустить параллельно. Добавьте свой скрипт transform к каждому выводу условного разбиения. Теперь вы также должны увеличить «Потоки двигателя». свойство :) и эти преобразования будут выполняться параллельно. (Примечание: на основании тега я предполагаю, что вы используете SSIS 2008. Вам потребуется вставить дополнительные преобразования All All, чтобы он работал в SSIS 2005).

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

Другие советы

Если вы выполняете этот процесс, используя " поток данных " контейнера, то есть свойство, называемое «EngineThreads» значение по умолчанию равно 5. Вы можете установить большее значение, например, 20, что позволит выделить больше потоков для обработки этих строк.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top