2010-09-03 7 views
0

La version courte est la suivante: je cherche un moyen de hiérarchiser certaines tâches dans les flux de contrôle SSIS 2005. C'est-à-dire que je veux être en mesure de le configurer pour que la tâche B ne démarre pas avant que la tâche A ait démarré, mais que la tâche B n'ait pas besoin d'attendre la fin de la tâche A. L'objectif est de réduire la durée pendant laquelle les threads inactifs attendent que la tâche A soit terminée pour pouvoir passer aux tâches C, D & E.Priorité du flux de contrôle SSIS 2005

La question à laquelle je suis confrontée est la conversion d'un entrepôt de données charger à partir d'un travail linéaire qui appelle un groupe de fournisseurs de services à un package SSIS appelant les mêmes fournisseurs de service mais exécutant plusieurs threads en parallèle. Donc, fondamentalement, j'ai un tas d'objets Execute Task et Sequence Container SQL avec Precedent Constraints mappant les dépendances. Jusqu'à présent, pas de problèmes, les choses fonctionnent très bien et cela réduit considérablement le temps de chargement.

Cependant, j'ai remarqué que les tâches sans dépendance en aval sont généralement séquencées avant celles qui ont des dépendances. Cela provoque beaucoup de temps d'inactivité dans certains endroits que je voudrais minimiser. Par exemple: J'ai environ 60 procs impliqués dans cette charge, ~ 10 d'entre eux n'ont aucune dépendance et peuvent s'exécuter à tout moment. Puis j'en ai un autre sans dépendances en amont, mais presque toutes les autres tâches dans le travail en dépendent. Je voudrais m'assurer que la tâche avec les dépendances est exécutée avant que je prenne n'importe quelles tâches sans dépendances. C'est juste un exemple, il y a des situations similaires dans d'autres endroits.

Des idées?

Répondre

0

Je ne sais pas de façon élégante de le faire, mais mon premier coup serait quelque chose comme ça ..

Container séquence avec le proc qui doit exécuter d'abord. Dans ce même conteneur de séquence, mettez une tâche de script qui attend seulement 5 à 10 secondes avant que chacune des 10 étapes indépendantes puisse s'exécuter. Puis enchaînez le reste des procs sous ce conteneur de séquence.

1

Je suis en retard dans la mise à jour ici, mais j'ai également soulevé ce problème sur les forums MSDN et nous avons été en mesure de concevoir un travail partiel. Voir here pour le fil complet, ou here pour la demande de fonctionnalité demandant à Microsoft de nous donner un moyen de le faire proprement ...

La version courte est que vous utilisez une série de variables booléennes pour contrôler les boucles qui agissent comme des barrages routiers et empêcher le flux d'atteindre les tâches de priorité inférieure jusqu'à ce que les éléments de priorité plus élevée aient commencé.

Les étapes sont les suivantes:

  • Déclarez une variable bool pour chacune des tâches prioritaires et par défaut les valeurs à false.
  • Créez un événement de pré-exécution pour chacune des tâches à priorité élevée.
  • Dans l'événement de pré-exécution, créez une tâche de script qui définit le bool approprié sur true.
  • A chaque point d'étranglement, insérez un pour chaque boucle qui boucle alors que les booléens appropriés sont faux. (J'ai un script avec 1 seconde de sommeil à l'intérieur de chaque boucle mais il fonctionne aussi avec des boucles vides.)

Si cela est fait correctement, cela vous donne un outil où à chaque point d'étranglement le paquet a un certain nombre de tâches hautement prioritaires prêt à fonctionner et une boucle de blocage qui l'empêche de descendre dans les branches de priorité inférieure jusqu'à ce que les éléments de haute priorité soient exécutés.Une fois que toutes les tâches de haute priorité ont été démarrées, la boucle s'efface et permet à tous les threads restants de passer aux tâches de priorité inférieure. Le pire des cas est qu'un thread se trouve dans la boucle en attendant que d'autres threads viennent et ramassent les tâches prioritaires. L'inconvénient majeur de cette approche est le risque de blocage du paquet si vous avez trop de boucles de blocage mises en file d'attente en même temps, ou mal interprété vos dépendances et avez des boucles en attente pour les tâches qui ne démarrent jamais. Une analyse minutieuse est nécessaire pour décider quels éléments méritent une priorité plus élevée et où insérer exactement les blocs.

Questions connexes