Duplizieren einiger Zeilen eines Datenflusses in SSIS

7

Ich habe einen Datenfluss, um Daten von einer alten Datenbank in eine neue zu migrieren. Das alte Design hatte alle Daten und historischen Informationen (Änderungen) in einer einzigen Tabelle mit einer "Version" (inkrementierende Ganzzahl) für die Zeile gespeichert.

Das neue Design verfügt über zwei Tabellen, eine für den "aktuellen" Status der Daten und eine Audit- (oder Verlaufs-) Tabelle, in der Änderungen mithilfe eines Triggers aufgezeichnet werden. Daher existiert nur eine Zeile für die "aktuellen" Daten und es gibt viele Verlaufszeilen.

In meinem SSIS-Paket verwende ich die folgenden Komponenten, um die aktuellen Daten in eine Tabelle zu kopieren, aber dann alle Daten an die Prüftabelle zu senden.

SSIS-Datenfluss

Der Multicast wird verwendet, um den Datenstrom aufzuteilen, und die bedingte Aufteilung identifiziert die "aktuelle" Zeile und sendet diese an die Order-Tabelle (die Tabelle heißt eigentlich nicht Order , bevor jemand Kommentare zur Verwendung eines reservierten Wortes für einen Tabellennamen abgibt).

Ich habe diesen Ablauf erstellt, weil ich keine Möglichkeit gefunden habe, mithilfe der bedingten Aufteilung alle Daten an das Überwachungsziel und nur die aktuelle Zeile an die andere zu senden .

Ich gehe davon aus, dass das Erstellen aller doppelten Daten und das anschließende Verwerfen in ein Papierkorbziel nicht sehr effizient ist. Da ich ungefähr 52 Millionen Zeilen migrieren muss, mache ich mir Sorgen, dass die Umwandlung Tage dauern wird.

Gibt es einen besseren (effizienteren) Weg, um die Datenaufteilung zu erreichen?

Hinweis zu Daten: Ich habe ein row_number()auf die Daten angewendet, mit dem ich die "aktuelle" Zeile als Nummer 1 identifizieren kann. Alle Zeilen einschließlich "aktuell" müssen zum Ziel der Prüftabelle gehen.

BEARBEITEN: Ich habe eine Alternative zu Multicast und Conditional Split gefunden, die in diesem Blogbeitrag von SSIS Junkie vorgeschlagen wird: Mehrere Ausgaben einer synchronen Skripttransformation

Es verwendet eine Skriptkomponente, um Daten an eine oder mehrere Ausgaben zu senden. Ich versuche diese Methode, um festzustellen, ob sie schneller ist, aber nachdem ich Kenneths Antwort und Vorschlag zum Entfernen des Papierkorbziels gesehen habe, bin ich mir nicht sicher, ob dies der Fall sein wird.

Tony
quelle
Die Skriptkomponente sollte in der Tat die Leistung verbessern. Es reduziert die Datenmenge, die Speicherplatz freigibt.
Kenneth

Antworten:

3

Ich sehe kein offensichtliches Problem mit diesem Datenfluss. Ich empfehle immer, so viel Arbeit wie möglich in Ihren Quellabfragen zu erledigen. Wenn Sie also zu Beginn ein Dataset erstellen können, mit dem Sie beide Tabellen über eine einfache Aufteilung füllen können, wird sicherlich weniger Speicher benötigt. Solche Dinge sind jedoch je nach Datenquelle und Datenformat nicht immer möglich.

Das Papierkorbziel ist auch gut für die Entwicklung / das Debuggen, aber nicht gut für die Produktion. Entfernen Sie es. Lassen Sie die 'Unerwünschten Daten' bei der Aufteilung ablaufen. SSIS kann den Rest herausfinden.

Solange Sie das Blockieren von Komponenten (UNION, MERGE usw.) vermeiden, gibt es keinen Grund, warum dieser Vorgang Tage dauern würde. Ich verarbeite häufig viele Millionen Zeilen in SSIS ohne Probleme. SSIS ist nur so langsam wie die Person, die den Prozess entworfen hat.

Gibt es derzeit Leistungsprobleme?

Kenneth
quelle
Vielen Dank, ich wusste nicht, dass Sie den Ausgang des bedingten Split einfach getrennt lassen können. Als ich das Paket an einer Teilmenge der Daten (ca. 32 m Zeilen) getestet habe, hat es 20 Stunden gedauert. Das fühlt sich für mich langsam an, aber es war das Lesen von Daten aus einer Datenbank und das Schreiben in eine andere auf demselben Server. Das kann also ein Problem sein.
Tony
Das klingt auch langsam. Wenn dies eine einmalige Operation ist und 20 Stunden akzeptabel sind, würde ich mir darüber keine Sorgen machen. Wenn sich dieser Prozess wiederholt, würde ich versuchen, ihn zu optimieren. Die Anzahl der Zeilen sagt mir nicht viel. Es wird mehr mit der Größe der Daten im Puffer, der Netzwerklatenz usw. zu tun haben
Kenneth
1
Ich bin damit einverstanden, es war waaaaay zu langsam :) Ich ließ die Netzwerk-Leute die Box überprüfen, auf der das Paket ausgeführt wird, und sie fanden einen Netzwerkkonfigurationsfehler, sodass die Daten einfach nicht schnell genug ein- und ausgehen konnten. Ich habe auch die OLE DB-Quelle in eine RAW-Datei geändert (Daten werden in die SISS-Box geschrieben), sodass ich nur in die DB schreibe. Diese beiden Änderungen reduzierten die Ladezeit auf 45 Minuten!
Tony