Как сделать этот сценарий SSIS более параллельным - PullRequest
1 голос
/ 06 января 2009

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

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

Теперь у меня есть простая задача потока данных -> GetData-> Run Script (Run Process, Parse Output) -> Store Data Для 6000 строк это заняло 3 часа. Слишком много.

Ответы [ 2 ]

3 голосов
/ 06 января 2009

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

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

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

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

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

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

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

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

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

1 голос
/ 06 января 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...