it-swarm.com.de

SSIS-Datenfluss-Datenzugriffsmodus - Wozu dient "Tabelle oder Ansicht" im Vergleich zum schnellen Laden?

Mit dem SQL Server Business Intelligence-Entwicklungsstudio mache ich eine Menge Flatfiles, um OLE DB-Zieldatenflüsse zum Importieren von Daten in meine SQL Server-Tabellen. Unter "Datenzugriffsmodus" im = OLE DB-Zieleditor, standardmäßig "Tabelle oder Ansicht" anstelle von "Tabelle oder Ansicht - schnelles Laden". Was ist der Unterschied? Der einzige erkennbare Unterschied, den ich wahrnehmen kann, ist, dass das schnelle Laden übertragen wird die Daten viel schneller.

9
coburne

Die Datenzugriffsmodi der OLE DB-Zielkomponente) gibt es in zwei Varianten - schnell und nicht schnell.

Schnell, entweder "Tabelle oder Ansicht - schnelles Laden" oder "Variable des Tabellen- oder Ansichtsnamens - schnelles Laden" bedeutet, dass Daten satzbasiert geladen werden.

Langsam - Entweder die Variable "Tabelle oder Ansicht" oder "Name der Tabelle oder Ansicht" führt dazu, dass SSIS Singleton-Einfügeanweisungen an die Datenbank ausgibt. Wenn Sie 10, 100, vielleicht sogar 10000 Zeilen laden, gibt es wahrscheinlich kaum nennenswerte Leistungsunterschiede zwischen den beiden Methoden. Irgendwann werden Sie jedoch Ihre SQL Server-Instanz mit all diesen kleinen Anfragen überlasten. Außerdem werden Sie Ihr Transaktionsprotokoll missbrauchen.

Warum sollten Sie jemals die nicht schnellen Methoden wollen? Schlechte Daten. Wenn ich 10000 Datenzeilen einsenden würde und die 9999. Zeile ein Datum vom 29.02.2015 hätte, hätten Sie 10.000 atomare Einfügungen und Commits/Rollbacks. Wenn ich die Fast-Methode verwendet habe, wird dieser gesamte Stapel von 10.000 Zeilen entweder alle oder keine von ihnen speichern. Und wenn Sie wissen möchten, welche Zeile (n) fehlerhaft sind, beträgt die niedrigste Granularitätsstufe 10.000 Zeilen.

Jetzt gibt es Ansätze, um so viele Daten wie möglich so schnell wie möglich zu laden und trotzdem mit schmutzigen Daten umzugehen. Es ist ein kaskadierender Fehler Ansatz und es sieht ungefähr so ​​aus

(cascading failure insert

Die Idee ist, dass Sie die richtige Größe finden, um so viel wie möglich auf einmal einzufügen. Wenn Sie jedoch schlechte Daten erhalten, werden Sie versuchen, die Daten in immer kleineren Stapeln erneut zu speichern, um zu den fehlerhaften Zeilen zu gelangen. Hier habe ich mit einer maximalen Einfüge-Commit-Größe (FastLoadMaxInsertCommit) von 10000 begonnen. Bei der Disposition der Fehlerzeile ändere ich sie von Redirect Row In Fail Component.

Das nächste Ziel ist das gleiche wie oben, aber hier versuche ich ein schnelles Laden und speichere es in Stapeln von 100 Zeilen. Testen Sie erneut oder geben Sie vor, eine angemessene Größe zu finden. Dies führt zu 100 Stapeln von 100 Zeilen, die gesendet werden, da wir wissen , dass irgendwo mindestens eine Zeile die Integritätsbeschränkungen für die Tabelle verletzt hat.

Ich füge dann eine dritte Komponente zum Mix hinzu, diesmal speichere ich in Stapeln von 1. Oder Sie können den Tabellenzugriffsmodus einfach von der Fast Load-Version weg ändern, da dies das gleiche Ergebnis liefert. Wir werden jede Zeile einzeln speichern und dadurch können wir "etwas" mit den einzelnen fehlerhaften Zeilen tun.

Schließlich habe ich ein ausfallsicheres Ziel. Vielleicht ist es die "gleiche" Tabelle wie das beabsichtigte Ziel, aber alle Spalten werden als nvarchar(4000) NULL deklariert. Was auch immer an diesem Tisch landet, muss recherchiert und bereinigt/verworfen werden oder was auch immer Ihr schlechter Datenauflösungsprozess ist. Andere speichern eine flache Datei, aber was auch immer Sinn macht, um schlechte Daten zu verfolgen, funktioniert.

13
billinkc

Fast Load ist unter FAST LOAD-Optionen gut dokumentiert

  • Behalten Sie Identitätswerte aus der importierten Datendatei bei oder verwenden Sie eindeutige Werte, die von SQL Server zugewiesen wurden.

  • Behalten Sie während des Massenladevorgangs einen Nullwert bei.

  • Überprüfen Sie die Einschränkungen für die Zieltabelle oder -ansicht während des Massenimportvorgangs.

  • Erwerben Sie eine Sperre auf Tabellenebene für die Dauer des Massenladevorgangs. Geben Sie die Anzahl der Zeilen im Stapel und die Festschreibungsgröße an.


Was ist der Unterschied; Der einzige erkennbare Unterschied, den ich wahrnehmen kann, ist, dass die Daten beim schnellen Laden viel schneller übertragen werden.

Unter der Haube verwendet table or view Für jede Zeile einen individuellen SQL-Befehl zum Einfügen, während table or view - with fast load Den Befehl BULK INSERT verwendet.

Wenn Sie oben Optionen sehen, die in BULK INSERT verfügbar sind, z. number of rows in the batch = ROWS_PER_BATCH Und commit size = BATCHSIZE

Ein anderes Szenario wird sein ..

Die Standardgröße für das maximale Einfügen von Commits (2147483647) ist zu hoch. So kann z.B. Sie fügen 500 KB Zeilen ein und aufgrund einer PK-Verletzung schlägt der Stapel fehl. In diesem Szenario schlägt der gesamte Stapel fehl, wenn Sie die Option SCHNELLLADEN verwenden. Sie können die Fehlerbeschreibung auch nicht erhalten.

Hier können Sie table or view Als Zielfehlerausgabe haben. Von 500 KB verwenden Sie FAST LOAD als Start mit einer Insert-Commit-Größe von 5 KB. Wenn eine Zeile in diesem Stapel fehlschlägt, leiten Sie diesen 5-KB-Stapel zum Laden von table or view Weiter. Dabei wird NUR für 5-KB-Zeilen zeilenweise eingefügt, und Sie können den Fehler von table or view Auch auf a umleiten flache Datei .. Wenn eine Zeile den Stapel bei 5 KB nicht besteht, können Sie genau bestimmen, was den Fehler verursacht hat.

Der Vorteil der obigen Methode besteht darin, dass, wenn keine der Zeilen ausfällt, BULK INSERT (schnelles Laden) für den gesamten Stapel verwendet wird.

SSIS-Fan billinkcbeantwortete eine ähnliche Frage zu Stackoverflow .

5
Kin Shah