2010-09-07 5 views
1

J'utilise SQL Server 2005 pour développer un package SSIS. Mon flux de données contient une recherche SSIS. Chacune des lignes que je suis en train de traiter a ces colonnes (parmi d'autres): ID1, detailsID1, ID2, detailsID2. La valeur de la colonne detailsID1 doit être chargée à partir d'une recherche basée sur ID1 et de la valeur de l'élément detailsID1 à partir d'une autre recherche basée sur ID2. Le fait est que ces deux recherches sont identiques: je fais la même sélection pour les mêmes colonnes sur la même table (ID1 et ID2 sont des IDs d'enregistrements containtés par une table). Est-il possible que je peux utiliser une seule recherche pour charger les deux colonnes de détails? Je ne veux pas utiliser 2 consultations car cette table est énorme.Recherche SSIS avec des conditions variables

Avez-vous une idée sur la façon de faire cela? Toute idée est grandement appréciée!

+0

Si vous êtes proche de la mise à niveau vers 2008, mais n'avez pas encore d'argument convaincant - c'est tout. SSIS 2008 a une "transformation de cache" qui vous permettra de faire ceci. Vous remplissez le cache manuellement, puis vous pouvez utiliser ce cache plusieurs fois. –

+0

Cela semble génial, mais malheureusement, nous avons encore beaucoup de chemin jusqu'à arriver à 2008. – Diana

Répondre

1

Le composant de recherche peut être pénible pour les grandes tables. Vous pouvez essayer quelques options.

D'abord, utilisez une instruction SQL qui joint la table de recherche aux données source. Cela nécessiterait plusieurs tâches de flux de données. Votre flux de données existant est exporté vers une table intermédiaire de destination dans la base de données. Vous pouvez ensuite créer un nouveau flux de données dans lequel la source est la requête qui rejoint une fois votre table de recherche pour chaque recherche dans la table de transfert. Un exemple de requête peut être:

SELECT lt1.detailsID1, lt2.detailsID2, <other StagingTable columns> 
FROM StagingTable st 
LEFT OUTER JOIN LookupTable lt1 ON st.ID1 = lt1.ID1 
LEFT OUTER JOIN LookupTable lt2 ON st.ID2 = lt2.ID2 

Les recherches sont terminées dans le cadre de la requête SQL.

Une autre option consiste à effectuer le processus de jointure à l'aide de composants de flux de données. Notez que celui-ci utilisera beaucoup de mémoire sur l'ordinateur où s'exécute le package SSIS. À l'aide de votre flux de données actuel, ajoutez une nouvelle source qui récupère les données de la table de recherche.

Ajoutez un composant Multicast au flux de données et créez un chemin de flux de données à partir de la sortie source vers l'entrée Multicast.

Ajoutez un composant Fusionner une jointure et ajoutez la sortie de la source principale en tant qu'entrée gauche et ajoutez la première sortie Multicast comme entrée correcte. Notez que les entrées doivent déjà être triées dans la séquence de la clé de jointure (ID1 pour la première jointure et ID2 pour la deuxième jointure - voir ci-dessous). Configurez la jointure de fusion en tant que jointure externe gauche avec correspondance sur les colonnes ID1. Inclure la colonne DetailID1 dans la sortie

Ajoutez un composant de tri et un second jointure de fusion. La sortie de la première jointure Merge va au composant Sort. Définissez la clé de tri sur la colonne ID2. La sortie Sort va au second composant Fusionner la jointure en tant qu'entrée de jointure à gauche. La deuxième sortie de multidiffusion passe à la deuxième entrée de fusion de fusion. Configurer la deuxième fusion Joindre la même que la première fusion, mais pour la colonne ID2.

alt text

Comme vous pouvez le voir, ce processus est beaucoup plus de travail. La première solution sera probablement votre meilleure solution, mais vous devriez comparer les solutions pour de meilleures performances.

+0

Merci beaucoup pour votre réponse. J'espérais en quelque sorte une approche plus directe :). Comme j'ai besoin d'être rapide et que je devrais le faire rapidement (moins de 1 jour), j'opterai pour 2 recherches avec la mise en cache activée - ce n'est pas la meilleure option, mais c'est une option. Merci encore pour votre réponse! – Diana

+0

Voici un exemple du blog de Todd McDermid pour les recherches multiples. http://toddmcdermid.blogspot.com/2010/09/parallelism-in-ssis-multiple-lookups.html – CTKeane

+0

Bel article, merci de l'avoir porté à mon attention. – Diana

Questions connexes