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


9

Mit dem SQL Server Business Intelligence-Entwicklungsstudio mache ich viele Flatfiles mit OLE DB-Zieldatenflüssen, um Daten in meine SQL Server-Tabellen zu importieren. Unter "Datenzugriffsmodus" im OLE DB-Zieleditor wird standardmäßig "Tabelle oder Ansicht" anstelle von "Tabelle oder Ansicht - schnelles Laden" verwendet. Was ist der Unterschied; Der einzige erkennbare Unterschied, den ich wahrnehmen kann, ist, dass die Daten beim schnellen Laden viel schneller übertragen werden.

Antworten:


13

Die Datenzugriffsmodi der OLE DB-Zielkomponente sind in zwei Varianten erhältlich: 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 Fehleransatz und es sieht ungefähr so ​​aus

kaskadierender Fehlereinsatz

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 in Redirect Rowvon 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 dazu, dass 100 Stapel von 100 Zeilen gesendet werden, da wir wissen, dass irgendwo dort mindestens eine Zeile vorhanden ist, die 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 deklariert nvarchar(4000) NULL. 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.


5

Fast Load ist unter den Optionen FAST LOAD 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 table or viewwird für jede einzufügende Zeile ein einzelner SQL-Befehl verwendet, während vs table or view - with fast loadden Befehl BULK INSERT verwendet.

Wenn Sie oben Optionen sehen, die in BULK INSERT verfügbar sind, zB number of rows in the batch= ROWS_PER_BATCHund commit size=BATCHSIZE

Ein anderes Szenario wird sein ..

Die Standardgröße für das maximale Einfügen von Commits (2147483647) ist zu hoch. Wenn Sie beispielsweise 500.000 Zeilen einfügen, schlägt der Stapel aufgrund einer PK-Verletzung 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 viewals Ziel Fehlerausgabe haben. Von 500 KB verwenden Sie FAST LOAD als Start mit einer Insert-Commit-Größe von 5 KB. Wenn 1 Zeile in diesem Stapel fehlschlägt, leiten Sie diese 5K-Stapel zum table or viewLaden um. Dabei wird NUR für 5K-Zeilen zeilenweise eingefügt, und Sie können den Fehler auch table or viewin eine flache Datei umleiten . Wenn also eine Zeile fehlschlägt, wird der Stapel fehlgeschlagen Bei 5K 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.

Der SSIS- Fan billinkc beantwortete eine ähnliche Frage zu Stackoverflow .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.