Ich habe eine Datenbank, in der ich Dateien in eine Staging-Tabelle lade. Aus dieser Staging-Tabelle habe ich 1-2 Joins, um einige Fremdschlüssel aufzulösen und diese Zeilen in die endgültige Tabelle einzufügen (die eine Partition pro Monat hat). Ich habe ungefähr 3,4 Milliarden Zeilen für Daten aus drei Monaten.
Was ist der schnellste Weg, um diese Zeilen vom Staging in den Final Table zu bekommen? SSIS-Datenflusstask (der eine Ansicht als Quelle verwendet und schnell geladen werden kann) oder Befehl IN AUSWAHL EINFÜGEN ...? Ich habe die Datenflusstask ausprobiert und kann in ungefähr 5 Stunden ungefähr 1 Milliarde Zeilen abrufen (8 Kerne / 192 GB RAM auf dem Server), was sich für mich sehr langsam anfühlt.
Antworten:
Ein gemeinsamer Ansatz:
INSERT dbo.[Target] WITH (TABLOCKX) SELECT ...
n
Reihen tun , was die Belastung des Transaktionsprotokolls verringern kann, und natürlich bedeutet, dass Sie nur von dieser Charge starten müssen, wenn eine Charge fehlschlägt. Ich habe darüber gebloggt (obwohl in Bezug auf Löschvorgänge dieselben grundlegenden Konzepte gelten): http://www.sqlperformance.com/2013/03/io-subsystem/chunk-deletesWenn Ihre Partitionen physisch und nicht nur logisch sind, können Sie Zeit gewinnen, indem verschiedene Prozesse verschiedene Partitionen gleichzeitig füllen (dies bedeutet natürlich, dass Sie
TABLOCK
/ nicht verwenden könnenTABLOCKX
). Dies setzt voraus, dass die Quelle auch für die Auswahl mehrerer Prozesse ohne Überlappung / Sperrung usw. geeignet ist und diese Seite der Operation noch langsamer wird (Hinweis: Erstellen Sie einen Clustered-Index für die Quelle, der dem Partitionsschema für das Ziel entspricht).Sie können auch etwas viel primitiveres in Betracht ziehen, wie
BCP OUT
/BCP IN
.Ich weiß nicht, dass ich zu SSIS springen würde, um dabei zu helfen. Es gibt wahrscheinlich einige Effizienzvorteile, aber ich weiß nicht, dass der Aufwand die Einsparungen rechtfertigt.
quelle
Wenn Sie Ihr Problem aus der Sicht von SSIS betrachten, ist der Grund, warum dies möglicherweise so lange gedauert hat, der, dass Sie keine Stapelverarbeitung durchgeführt haben. Dies kann dazu führen, dass zu viele Zeilen die SSIS-Pipeline füllen und die SSIS-Leistung dadurch beeinträchtigt wird. Sie müssen lediglich Ihre Zeilen pro Batch-Einstellung und möglicherweise Ihre maximale Einfügungs-Commit-Größe ändern. Was Sie nun auch hier einstellen, hängt davon ab, wie viel Speicher auf Ihrem SSIS-Server verfügbar ist. Wie hoch ist die Festplattengeschwindigkeit Ihrer SQL Server-Instanz? Der beste Weg, dies zu tun, ist ein Test. Lässt zum Beispiel 10.000 verwenden. Dadurch wird ein Stapel zu einem Zeitpunkt von 10.000 an den Server gesendet, sodass sich Ihre Pipeline nicht überfüllt und dieser Prozess schneller ausgeführt werden kann. Diese Einstellungen werden in Ihrem OLEDB-Ziel festgelegt.
Wenn es ein Problem ist, können Sie auch vor und nach dem Ausführen eine SQL-Task hinzufügen, wie @AaronBertrand vorschlägt, und alle Indizes oder Einschränkungen der Tabelle entfernen / neu hinzufügen.
quelle