Présentation de la problématique:
J’ai une table de paramétrage, et un Composant Foreach qui va parcourir le ResultSet résultant de la requête suivante:
SELECT idParametre, nomParametre FROM dbo.Parametres
Et à chaque itérations, je vais effectuer une action (Remplir une table, vider une table, processer une partition de cube …)
Voilà donc à quoi pourrait ressembler mon package, les problèmes sont les suivants:
- Le traitement d’une itération de boucle occupe à peine 10% des capacités de ma machine.
- Le traitement est parallélisable (Dans le cas d’une insertion dans une table n’oubliez pas de décocher le « Table Lock »)
- C’est long ! Chaque itérations prend 15minutes
Solution possible:
Je vais donc vous proposer une solution simple sans composants supplémentaires.
- Créer un nouveau package que l’on nommera « Package Parent »
- Dans chacun des packages créer deux variables:
nbThread => Entier => Scope Package
Dans le package Parent:
idThread => Entier => Scope Local à chacun de nos composants Execute Package
Dans le Package Enfant:
idThread => Entier => Scope Package - Passer nos deux variables au package enfant (Le mode opératoire pour faire cela)
- Faire appel à notre package enfant autant de fois que de thread voulus.
- Mettre à jour la valeur des variables dans le package Parent:
- nbThread = 4
- idThread = 0 , 1 , 2 , 3 en fonction de l’execute Package
- Il ne reste qu’à variabiliser (ou paramétrer) notre requête SQL afin d’ajouter une clause WHERE ou l’on fera le modulo de l’id de la table par le nombre de Thread afin de vérifier si celui-cic à notre id de thread:
Avec une variable:
"SELECT idParametre, nomParametre FROM dbo.Parametres WHERE idParametre %"+ (DT_WSTR, 2) @[User::nbThread] +"="+(DT_WSTR, 2) @[User::ThreadId]
Ou directement en paramétrant la requête:(Un article sur comment procéder)
SELECT idParametre, nomParametre FROM dbo.Parametres WHERE idParametre % ? = ?
Conclusion:
Nous avons donc les deux packages suivants:
Parent:
Enfant:
Ainsi chacun de nos 4 packages va boucler sur son propre resultset et le traitement s’effectuera donc en parallèle.
Si vous vouliez paralléliser un flux de données, orientez vous plutôt vers le composant Balanced Data Distributor de Microsoft.