Ich habe ein furchtbar langsames SSIS-Paket. Es ist ziemlich schnell mit einer Datei und ziemlich schnell mit 100 Dateien oder weniger. (Ungefähr eine Sekunde pro Datei)
Wenn mein Verzeichnis jedoch Tausende (sehr kleine) Dateien enthält, zieht sich der Prozess furchtbar langsam hin. Ich bevorzuge es, diesen Prozess nur außerhalb der Geschäftszeiten auszuführen, aber wenn ich bis dahin warte, liegt die Anzahl der zu importierenden Flatfiles bei Tausenden.
Das Paket ist sehr einfach:
- Die äußere Schleife ist für alle (Dateiaufzählung, Dateipfad in Variable lesen)
- Im Inneren einfach importieren, ohne die Daten zu transformieren
Das ist es.
Die Leistung mit Tausenden von Dateien beträgt 15 Sekunden oder mehr pro Datei. Die Benutzeroberfläche (Status) zeichnet / scrollt so langsam, dass ich nicht einmal sehen kann, wo sie sich befindet - die gestempelte Zeit ist bei einer Ausführung, die vor 18 Stunden gestartet wurde, mehr als 15 Stunden alt.
Version: MSSQL 2012
quelle
Antworten:
Ich denke, Sie stoßen auf eine Einschränkung der Benutzeroberfläche / des Debuggers.
Ich habe zwei Pakete erstellt: MakeAllTheFiles und ReadAllTheFiles
MakeAllTheFiles akzeptiert als Eingabe die Anzahl der zu erstellenden Dateien. Es wird eine Pseudozufallsfunktion verwenden, um die Daten auf eine Anzahl (7) von Unterordnern zu verteilen.
MakeAllTheFiles
ReadAllTheFiles
Das allgemeine Erscheinungsbild der Verpackung ist somit
Ich habe zwei Verbindungsmanager definiert: Einer bezieht sich auf meine Datenbank und der andere auf eine flache Datei mit einem Ausdruck in der ConnectionString-Eigenschaft, sodass meine Variable verwendet wird
@[User::CurrentFileName]
Variablen, ich mag viele Variablen, also gibt es viele.
Meine Execute SQL-Aufgabe stellt einfach eine Tabelle auf, in die ich schreiben kann, und schlägt sie herunter, wenn sie bereits vorhanden ist.
Mein Foreach Enumerator betrachtet einfach alles in meinem Eingabeordner basierend auf der Dateimaske von * .txt und durchläuft Unterordner. Der aktuelle Dateiname wird meiner Variablen @ [User :: CurrentFileName] `zugewiesen
Der Datenfluss ist Moorstandard. Die dort abgeleitete Spaltentransformation fügt einfach die Variable Aktueller Dateiname zum Datenfluss hinzu, damit ich sie in meiner Tabelle aufzeichnen kann.
Analyse
Ich bin faul und wollte nichts Besonderes tun, um die Verarbeitungszeiten aufzuzeichnen. Deshalb habe ich meine Pakete im SSISDB-Katalog bereitgestellt und von dort aus ausgeführt.
Diese Abfrage überprüft die Katalogdaten, um herauszufinden, wie lange das Paket ausgeführt wurde, wie viele Dateien es verarbeitet hat, und generiert dann einen laufenden Durchschnitt für die Anzahl der Dateien. Lauf 10047 war schlecht und wurde von der Analyse ausgeschlossen.
Die resultierenden Daten (kostenlose SQLFiddle )
Aufgrund dieser Stichprobengröße sehe ich keinen nennenswerten Unterschied zwischen der Verarbeitung von 100, 1000 oder 10.000 Dateien mit SSIS, wie hier beschrieben.
Grundursachenannahme
Basierend auf dem Kommentar dazu
DTExecUI.exe
heißt es, dass Sie das Paket in Visual Studio ausführen (BIDS / SSDT / Name der Woche). Um die hübschen Farbänderungen und Debugging-Funktionen zu erhalten, wird die native Ausführung (dtexec.exe) in den Debugging-Prozess eingebunden. Dies führt zu einer spürbaren Beeinträchtigung der Ausführung.Verwenden Sie die Entwurfsumgebung, um Ihre Pakete zu erstellen und für kleinere Datensätze auszuführen. Größere werden am besten über die nicht grafischen und nicht debuggerischen Ausführungsschnittstellen verarbeitet (Shift-F5 in VS, Bereitstellung im SSIS-Katalog und Ausführung von dort oder Shell zur Befehlszeilenschnittstelle und Verwendung von dtutil.exe).
quelle