Приоритет потока управления служб SSIS 2005 - PullRequest
0 голосов
/ 03 сентября 2010

Короткая версия: я ищу способ расстановки приоритетов для определенных задач в потоках управления служб SSIS 2005. То есть я хочу иметь возможность настроить его так, чтобы Задача B не запускалась до тех пор, пока Задача A не была запущена, но Задаче B не нужно ждать завершения Задачи A. Цель состоит в том, чтобы сократить количество времени, в течение которого у меня простаивают незанятые потоки, ожидающие завершения Задачи A, чтобы они могли перейти к Задачам C, D & E.

Проблема, с которой я сталкиваюсь, заключается в преобразовании нагрузки хранилища данных из линейного задания, которое вызывает группу SP, в пакет SSIS, вызывающий те же SP, но выполняющие несколько потоков параллельно. В общем, у меня есть куча объектов «Выполнение SQL» и «Контейнер последовательностей» с прецедентными ограничениями, отображающими зависимости. Пока проблем нет, все работает отлично, и это значительно сократило время загрузки.

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

Например: у меня около 60 процов, связанных с этой загрузкой, ~ 10 из них вообще не имеют зависимостей и могут работать в любое время. Затем у меня есть еще один без зависимостей, но почти все другие задачи в работе зависят от него. Я хотел бы убедиться, что задача с зависимостями запущена, прежде чем я выберу любую из задач без зависимостей. Это только один пример, подобные ситуации встречаются и в других местах.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 25 февраля 2011

Я опоздал с обновлением здесь, но я также поднял эту проблему на форумах MSDN, и мы смогли разработать частичную работу вокруг. См. здесь для полного потока или здесь для запроса функции, в котором Microsoft просит нас сделать это чисто ...

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

Шаги:

  • Объявите переменную bool для каждой задачи с высоким приоритетом и по умолчанию установите значения false.
  • Создать предварительно выполнить событие для каждой задачи с высоким приоритетом.
  • В событии pre-execute создайте задачу скрипта, которая устанавливает для соответствующего bool значение true.
  • В каждой точке дросселирования вставьте a для каждого цикла, который зациклится, в то время как соответствующие bool (s) ложны. (У меня есть скрипт с 1-секундным сном внутри каждого цикла, но он также работает с пустыми циклами.)

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

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

0 голосов
/ 03 сентября 2010

Я не знаю каких-либо изящных способов сделать это, но мой первый выстрел будет примерно таким ...

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

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