Der normale Ladevorgang
Die Konfiguration dieses Datenzugriffsmodus ist sehr
einfach: Es gibt keine weiteren Einstellmöglichkeiten im Standard-Editor. Mit
dem Profiler können Sie herausfinden, wie dieser Modus funktioniert:- Zunächst erzeugt das SSIS-Paket einmal einen Aufruf der gespeicherten Prozedur sp_cursoropen.
- Anschließend erzeugt es für jeden zu schreibenden
Datensatz einen Aufruf der gespeicherten Prozedur sp_cursor.
Nachteil: SQL Server protokolliert in diesem Modus jeden Schreibvorgang vollständig im Transaktionsprotokoll. Die vollständige Protokollierung der einzelnen Schreibvorgänge
kann das Einfügen großer Datenmengen erheblich ausbremsen.
Der schnelle Ladevorgang
Konfigurationsdialog für schnelles Laden |
- Das SSIS-Paket erzeugt ein einziges INSERT BULK
Statement.
Nachteil: Bei dieser Variante wird das Einfügen im Rahmen
einer Transaktion durchgeführt. Wenn also 100.000 Zeilen ins Ziel eingefügt
werden und die letzte Zeile beim Schreiben einen Fehler auslöst, dann rollt der
Zielserver die gesamte Transaktion zurück und der ganze Einfügevorgang war
wirkungslos.
Um diesen Nachteil wettzumachen, können Sie folgendes
Entwurfsmuster anwenden:
Entwurfsmuster für die Auswertung fehlerhafter Zeilen beim schnellen Laden |
Feinheiten beim schnellen Ladevorgang
Beim schnellen Laden gibt es (abgesehen von den vier Haken
für Beibehalten der Identitätswerte, Behandeln von NULL-Werten, Setzen einer Tabellensperre
und das Überprüfen von Einschränkungen) zwei Einstellungen, die für das Verarbeiten
von Transaktionen von Bedeutung sind:- Maximale Einfügungcommitgröße (maximum insert commit size) bestimmt die Anzahl von Zeilen, nach denen die Transaktion spätestens beendet wird. Mit der Standardeinstellung (siehe Bild) wird wohl jeder realistische Ladevorgang im Rahmen einer Transaktion durchgeführt. Aber ist das auch gut? Bei sehr großen Datenmengen kann das Transaktionsprotokoll der Zieldatenbank dadurch auf eine erhebliche Größe anwachsen. Außerdem sperrt der Datenbankserver immer mehr Datensä tze (Stichwort: Sperrenausweitung / lock escalation), was andere Prozesse behindert könnte. Um dem entgegenzuwirken, sollten Sie die Größe einer Transaktion zum Beispiel auf 5000 Zeilen begrenzen. Dann beendet der Datenflusstask immer nach 5000 Zeilen die Transaktion und beginnt eine neue.
- Zeilen pro Batch ist eine Größe, zu der
praktisch keine Dokumentation zu finden ist. Das hängt damit zusammen, dass der
INSERT BULK Befehl (Verwechslungsgefahr: es handelt sich dabei nicht um das
BULK INSERT Kommando), den SSIS generiert, nur sehr oberflächlich dokumentiert
ist. Programmierer können ihn mit der .NET Klasse SQLBulkCopy verwenden, aber auch hier findet sich
keine weitergehende Dokumentation zur Batchgröße. So bleibt uns
SSIS-Entwicklern nichts übrig, als im Zweifelsfall verschiedene Werte für
diesen Parameter auszuprobieren und den für unseren Fall besten Wert
experimentell zu ermitteln.