Здесь есть единственное узкое место, запускающее процесс для каждой строки. Увеличение "EngineThreads" не помогло бы вообще, так как в любом случае будет только один поток, выполняющий это конкретное преобразование сценария. Время, проведенное в других преобразованиях, вероятно, не имеет значения вообще. Процессы - это тяжелые объекты, и тысячи из них никогда не будут дешевыми.
Я могу придумать следующие идеи, чтобы сделать его лучше:
1) Лучший способ исправить это - преобразовать ваш собственный EXE-файл в сборку и вызвать его из сценария transform - чтобы избежать накладных расходов на создание процессов, анализ выходных данных и т. Д.
2) Если вам нужно использовать отдельные процессы, вы можете попытаться запустить эти процессы параллельно. Это поможет, если процесс в основном ожидает некоторого ввода / вывода (то есть он связан с вводом / выводом). Если процессы связаны с памятью или с процессором, вы не выиграете много, запустив их параллельно.
2А) Сложный скрипт, простой пакет.
Чтобы запустить их параллельно, измените метод ProcessInput в вашем скрипте, чтобы запускать процесс асинхронно, и не ждите завершения процесса - перейдите к следующей строке и создайте следующий процесс. Подпишитесь, чтобы обработать вывод и обработать событие Exited, чтобы вы знали, когда оно закончилось. Ограничьте количество процессов, запущенных параллельно, иначе у вас не хватит памяти. Дождитесь завершения всех процессов, прежде чем вернуться из вызова ProcessInput.
2B) Простой скрипт, сложный пакет.
Сохранить текущий последовательный скрипт, но разбить данные с помощью служб SSIS. Добавьте преобразование с условным разделением и разделите входной поток на несколько потоков, основываясь на некотором хэш-выражении - то, что заставит каждый выход получать примерно одинаковый объем данных. Количество потоков равно количеству экземпляров процесса, которые вы хотите запустить параллельно. Добавьте свой скрипт transform к каждому выводу условного разбиения. Теперь вы также должны увеличить свойство «Engine Threads» :), и эти преобразования будут выполняться параллельно. (Примечание: на основании тега я предполагаю, что вы используете SSIS 2008. Вам потребуется вставить дополнительные преобразования All All, чтобы он работал в SSIS 2005).
Это должно заставить его работать лучше, но миллионы процессов это много. Вы вряд ли получите действительно хорошую производительность здесь.