web-dev-qa-db-fra.com

Dupliquer des rangées d'un flux de données dans les SSIS

J'ai un flux de données pour migrer les données d'une ancienne base de données en une nouvelle. L'ancien design avait toutes les données et informations historiques (changements) stockées dans une seule table avec une "version" (incrémentant entier) contre la ligne.

La nouvelle conception comporte deux tables, une pour l'état "actuel" des données et une table d'audit (ou d'historique) qui enregistre les modifications à l'aide d'un déclencheur. Par conséquent, une seule rangée existe pour les données "actuelles" et il existe de nombreuses lignes d'histoire.

Dans mon paquet SSIS, j'utilise les composants suivants pour copier les données actuelles sur une seule table, puis envoyer toutes les données à la table d'audit.

SSIS data flow

La multidiffusion est utilisée pour scinder le flux de données et la division conditionnelle identifie la ligne "actuelle" et l'envoie à la table de commande (la table n'est pas réellement appelée ordre, avant que quiconque ne commencent à utiliser un mot réservé pour un nom de table).

J'ai créé ce flux car je ne pouvais pas voir un moyen d'utiliser la division conditionnelle à envoyer tout Les données à la destination d'audit et uniquement la ligne actuelle à l'autre.

Je suppose que la création de toutes les données en double et ensuite le jeter à une destination de la corbeille n'est pas très efficace et que j'ai environ 52 millions de lignes pour migrer, je suis inquiet, la transformation va prendre des jours.

Existe-t-il une meilleure façon (plus efficace) d'atteindre la division des données?

Remarque sur les données: J'ai appliqué une row_number() sur les données qui me permettent d'identifier la ligne "actuelle" comme numéro 1, Toutes les lignes, y compris "actuelle", doivent aller à la destination de la table d'audit.

Edit: J'ai trouvé une alternative à la multidiffusion et à la scission conditionnelle suggérée par ce blog post de SSIS Junkie: multiples sorties d'un script synchrone transformer

Il utilise un composant de script pour envoyer des données à une ou plusieurs sorties. J'essaie cette méthode de voir si elle est plus rapide mais après avoir vu la réponse de Kenneth et la suggestion sur la suppression de la destination de la corbeille, je ne suis pas sûr que ce sera.

7
Tony

Je ne vois aucune question flagrante avec ce flux de données. Je suggère toujours de faire le plus de travail possible dans vos requêtes source, de sorte que si vous pouvez créer un jeu de données au début qui vous permet de remplir les deux tables via une simple scission, elle utiliserait certainement moins de mémoire. Mais des choses comme ça ne sont pas toujours possibles en fonction de la source de données et du format de données.

En outre, la destination des ordures est bonne pour le développement/le débogage mais ne fait pas de bonne production. Retirez-le. Laissez les "indésirables indésirables" à la scission. SSIS peut comprendre le reste.

Tant que vous évitez de bloquer les composants (syndicat, fusionnez, etc.) Il n'y a aucune raison de prendre des jours. Je traite fréquemment plusieurs millions de lignes en SSIS sans problème. SSIS est seulement aussi lent que la personne qui a conçu le processus.

Est-ce que cela a actuellement des problèmes de performance?

3
Kenneth