Database
 sql >> Datenbank >  >> RDS >> Database

Inkrementelles Laden in SSIS

Die Menschen haben es immer eiliger. Sie wollen ihre Daten fast sofort. Und mehr noch, die Daten werden immer größer. Sie können also keine guten alten Techniken verwenden, weil sie „gut genug“ sind. Es muss schnell gehen. Und ETL-Schritte sind keine Ausnahme. Hier kommt die inkrementelle Last ins Spiel. Und wenn Sie sich auf dieser Seite befinden, suchen Sie wahrscheinlich nach inkrementellem Laden in SSIS.

Und das ist unser Fokus in diesem Artikel. Wir werden Vergleiche und Beispiele anstellen, um das inkrementelle Datenladen in SSIS Schritt für Schritt zu erklären. Und seien Sie versichert, es wird Ihnen nicht den Kopf zerbrechen, wenn Sie das herausfinden.

Folgendes erwartet Sie:

  • Was sind vollständiges Laden und inkrementelles Laden in ETL?
  • Was ist inkrementelles Laden von Daten in SSIS?
  • Die Unterschiede zwischen vollständigem Laden und inkrementellem Laden in SSIS
  • Inkrementelles Laden in SSIS mit CDC oder Change Data Capture
  • Inkrementelles Laden in SSIS mit DateTime-Spalten
  • So führen Sie inkrementelles Laden in SSIS mithilfe von Lookup durch
  • Das beste Tool zum Laden von SSIS-Daten

Jeder Abschnitt wird Unterabschnitte haben. Sie können zum gewünschten Thema springen, indem Sie auf die Links klicken.

Bevor wir mit den Beispielen beginnen, vergleichen wir die inkrementelle Last mit ihrem Gegenteil, der vollen Last.

Was sind Full Load und Incremental Load in ETL

Unabhängig davon, welche ETL-Tools Sie verwenden, haben vollständige und inkrementelle Ladevorgänge dieselbe Bedeutung. Lassen Sie uns sie unten beschreiben.

Volllast in ETL

Wie der Name schon sagt, lädt Full Load in ETL ALLE Daten von der Quelle zum Ziel. Eine Zieltabelle wird abgeschnitten, bevor alles aus der Quelle geladen wird. Deshalb wird diese Technik auch als Destructive Load bezeichnet . Diese Technik ist auch einfacher durchzuführen. Und das sichert auch höchste Datenintegrität. Aber die Größe Ihrer Daten ist heute größer als gestern. Wenn Sie dies also für ständig wachsende Daten verwenden, wird der Prozess mit der Zeit langsamer.

ETL-Volllast-Anwendungsfälle

  • Die Größe der Quelldaten ist gering und wird in den kommenden Jahren nicht wesentlich wachsen. Beispiele sind eine Liste mit Farben, einige Kategorien/Klassifizierungen, eine Liste mit Ländern und Städten und vieles mehr.
  • Es ist schwer zu sagen, was in der Quelle neu oder geändert ist.
  • Die Daten müssen von der Quelle bis zum Ziel genau gleich sein
  • Die Historie der Daten ist irrelevant und wird häufiger überschrieben

Inkrementelles Laden in ETL

In der Zwischenzeit ist Incremental Load auch so, wie der Name schon sagt. Nur die geänderten Daten werden von der Quelle zum Ziel geladen. Dies geschieht schrittweise im Laufe der Zeit. Diejenigen, die sich nicht geändert haben, werden so bleiben, wie sie sind. Das ist etwas schwierig. Sie müssen sicherstellen, dass alle Änderungen gesammelt und in das Ziel geladen wurden. Bei sehr großen Datenmengen wird dies jedoch schneller ausgeführt als der vollständige Ladevorgang.

Anwendungsfälle für inkrementelles ETL-Laden

  • Die Datengröße ist sehr groß und die Abfrage wird bei großen Ergebnismengen sehr langsam sein
  • Änderungen sind einfach abzufragen
  • Gelöschte Daten müssen im Ziel aufbewahrt werden, wie ein Prüfsystem

Was ist inkrementelles Laden in SSIS

Die grundlegenden Bestandteile eines inkrementellen Ladevorgangs in SSIS sind in Abbildung 1 dargestellt.

Das inkrementelle Laden in SSIS ist je nach Ihren Anforderungen tendenziell komplexer. Aber die einfache „Rezeptkarte“ in Abbildung 1 enthält alles, was Sie zum schrittweisen „Kochen“ von Daten benötigen. Das Erfassen von Änderungen in den Daten ist der herausfordernde Teil. Sie können das Ziel vermasseln, wenn Sie nicht aufpassen.

In den folgenden Abschnitten sehen Sie anhand von Beispielen, wie inkrementelles Laden in SSIS durchgeführt wird. Dazu gehören die Verwendung von ChangeData Capture (CDC), DateTime-Spalten und Lookups. Sie werden auch sehen, wie dies mit Devart SSIS-Komponenten gemacht wird.

Vergleichen wir im nächsten Abschnitt das inkrementelle Laden mit dem vollständigen Laden in SSIS.

Der Unterschied zwischen vollständigem Laden und inkrementellem Laden in SSIS

Sie haben bereits gesehen, wie inkrementelles Laden in SSIS aussieht (Abbildung 1). In der Zwischenzeit verhält es sich wie folgt mit dem SSIS-Vollladen in Abbildung 2 unten.

Der Unterschied zwischen Volllast und inkrementellem Laden in SSIS liegt im Paketdesign. Ein Full-Load-Design benötigt weniger Komponenten, die in das SSIS-Paket gezogen werden müssen. Es ist so einfach, dass wenig Nachdenken erforderlich ist. Aus diesem Grund neigen einige Entwickler aus falschem Produktivitätsgefühl dazu, meistens auf diese Technik zurückzugreifen.

Bei großen Datenmengen, sagen wir 15 TB, ist es jedoch nicht ratsam, jede Nacht ein Volllast-Designpaket auszuführen. Glauben Sie, dass es rechtzeitig fertig sein wird, bevor die Benutzer morgens ankommen? Das wird nicht passieren, weil Sie versuchen, die Datensätze erneut einzufügen, die sich überhaupt nicht geändert haben. Wenn das etwa 70 % der Daten sind, benötigen Sie je nach Serverressourcen mehr Ausfallzeit.

Das ist nicht akzeptabel.

Je mehr Sie in diesen Szenarien also incrementalload verwenden müssen. In den folgenden Abschnitten erfahren Sie, wie Sie Daten mit inkrementellem Laden schneller laden.

Inkrementelles Laden in SSIS mit CDC

Betrachten wir zunächst die Verwendung von Change Data Capture (CDC). Beachten Sie, dass wir von hier bis zu den nächsten 3 Beispielen einfache Beispiele verwenden werden. Das Verpackungsdesign verwischt also nicht das Ziel.

Bevor wir mit dem Beispiel beginnen, behandelt dieser Abschnitt Folgendes:

  • Erstens, wie CDC in einer Datenbank und Tabelle aktiviert wird
  • Erstellen Sie dann das SSIS-Paket für das inkrementelle Laden von SSIS mit CDC
  • Zum Schluss laufen und die Ergebnisse prüfen

Abbildung 3 zeigt die Bestandteile dieses Beispiels.

Change Data Capture (CDC) zeichnet Einfügungen, Löschungen und Aktualisierungen in einer Tabelle auf. Bevor Sie dieses Beispiel zum Laufen bringen können, benötigen Sie eine Datenbank und eine Tabelle, die für CDC konfiguriert sind.

So aktivieren Sie CDC in einer Datenbank und Tabelle

Datenbank- und Tabelleneinstellungen sind standardmäßig ohne CDC. Hier ist die T-SQL-Syntax, um eine Datenbank CDC-fähig zu machen:

-- point to the database you need to CDC-enable
USE SportsCarSales
GO

-- this will enable CDC to the current database.
EXEC sys.sp_cdc_enable_db
GO

Führen Sie dann Folgendes aus, um zu überprüfen, ob CDC tatsächlich aktiviert ist:

select name from sys.databases
where is_cdc_enabled=1

Wenn der Name der Datenbank, die Sie für CDC aktiviert haben, angezeigt wird, können Sie loslegen. Ihre Datenbank ist jetzt CDC-fähig.

Aber es endet hier nicht. Sie müssen angeben, welche Tabelle Sie auf Änderungen verfolgen möchten. Die sp_cdc_enable_table wird den Trick machen. Unten ist ein Beispiel dafür.

EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name   = N'sportsCarSales',
@role_name     = NULL,
@supports_net_changes = 1
GO

Das Ausführen des obigen Codes sollte zu ähnlichen Meldungen unten führen:

Job 'cdc.SportsCarSales_capture' started successfully.
Job 'cdc.SportsCarSales_cleanup' started successfully.

Diese Nachrichten sind die 2 neuen SQL Server-Agent-Jobs, die nach dem Aktivieren einer Tabelle für CDC erstellt wurden. Aus diesem Grund benötigen Sie den SQL Server-Agent, damit CDC funktioniert. Siehe Screenshot in Abbildung 4.

Einfügen, Löschen und Aktualisieren von sportsCarSales Die Tabelle zeichnet die Änderungen automatisch in einer anderen Tabelle mit dem Namen cdc.dbo_sportsCarSales_CT auf . Diese Tabelle hat Spalten wie das Original. Siehe Screenshot in Abbildung 5.

Der _$Vorgang Spalte in der linken Tabelle ist von besonderem Interesse. Mögliche Werte für diese Spalte sind 1 (Löschen), 2 (Einfügen), 3 und 4 (Aktualisieren). Update verwendet 2 Werte:einen für Spaltenwerte before das Update (das ist 3). Und die andere für Spaltenwerte nach das Update (das ist 4). Sie können diese Spalte überprüfen, wenn Sie die Werte überprüfen, bevor Sie Ihr SSIS-Paket ausführen. Die CDCSource und CDC-Splitter Komponenten verwenden diese Tabelle beim Identifizieren von Änderungen. Mehr dazu im nächsten Abschnitt.

Erstellen des SSIS-Pakets für inkrementelles SSIS-Laden mit CDC

Hier sind die Schritte zum Erstellen des SSIS-Pakets mit inkrementellem Laden mit CDC. Dies setzt voraus, dass Sie bereits über ein leeres Paket in Visual Studio 2019 verfügen. Unser Ziel hier ist es, die Zeilen aus sportsCarSales zu laden Tabelle in die FactSportsCarSales Faktentabelle in einem Data Warehouse.

Im Folgenden finden Sie eine Zusammenfassung der Schritte:

SCHRITT 1. Erstellen Sie 2 Datenbankverbindungs-Manager
SCHRITT 2. Ziehen Sie 2 CDC-Kontrollaufgabe in den Kontrollfluss
SCHRITT 3. Ziehen Sie eine Datenflussaufgabe und stellen Sie eine Verbindung zur CDC-Steuerungsaufgabe her

SCHRITT #1. Erstellen Sie 2 Datenbankverbindungsmanager

Wir benötigen hier 2 Datenbankverbindungen. Eine davon ist die ADO.Net-Verbindung, die auf die CDC-aktivierte Datenbank verweisen sollte. Erstellen Sie dann als Ziel eine OLE DB-Verbindung zu einem Data Warehouse. Beide sind SQL Server 2019-Datenbanken. Siehe entsprechend die Abbildungen 6 und 7. In diesem Beispiel befinden sich beide Datenbanken auf demselben Computer. Und wir verwenden die Windows-Authentifizierung, um eine Verbindung herzustellen.

Also in den Verbindungsmanagern Fenster, klicken Sie mit der rechten Maustaste und wählen Sie Neue ADO.Net-Verbindung . Füllen Sie dann die Server-, Authentifizierungs- und Datenbankeinstellungen aus, wie in Abbildung 6 unten gezeigt.

Erstellen Sie dann eine OLE DB-Verbindung zum Data Warehouse. Klicken Sie im Verbindungsmanager-Fenster mit der rechten Maustaste und wählen Sie Neue OLE DB-Verbindung . Geben Sie dann den Server-, Authentifizierungs- und Datenbanknamen ein. Geben Sie hier das Data Warehouse an.

SCHRITT #2. Ziehen Sie 2 CDC-Kontrollaufgabe in den Kontrollfluss

Es gibt zwei Dinge, die wir tun müssen, nachdem wir eine CDC-Kontrollaufgabe in den Kontrollfluss gezogen haben.

CDC-Start markieren

Zuerst müssen wir die CDC-Steuerungsaufgabe konfigurieren, um den CDC-Start zu markieren. Erstellen Sie dann eine CDC-Statustabelle. Dies kann in einem Konfigurationsfenster erfolgen. Siehe Abbildung 8 unten.

Nach den nummerierten Schritten in Abbildung 9 folgen die Details.

  1. Wählen Sie die ADO.Net-Verbindung aus, die wir in Abbildung 6 erstellt haben.
  2. Wählen Sie dann CDC-Start markieren .
  3. Klicken Sie auf Neu um eine CDC-Zustandsvariable zu erstellen. Dann erscheint ein Fenster. Klicken Sie auf OK um den Standardvariablennamen User::CDC_State zu erstellen .
  4. Wählen Sie die ADO.Net-Verbindung aus, damit wir den CDC-Status in dieser Datenbank speichern können.
  5. Klicken Sie auf Neu um eine Tabelle zum Speichern des Zustands zu erstellen. Das Skript ist bereits für Sie erstellt. Klicken Sie also einfach auf Ausführen im nächsten Fenster.
  6. Wählen Sie dann CDC_State aus als Staatsname.
  7. Klicken Sie abschließend auf OK .

Führen Sie nach dem Konfigurieren dieser CDC-Steuerungstask das Paket aus. Sie werden noch keine Datensätze sehen, die in die andere Datenbank kopiert wurden. Aber die Zustandstabelle (dbo.cdc_state ) wird mit Anfangswerten gefüllt.

Von hier aus können Sie diese CDC-Steuerungsaufgabe deaktivieren oder sie in der nächsten Aufgabe erneut mit neuen Werten überschreiben.

Verarbeitungsreichweite erhalten

Entweder Sie ziehen einen neuen CDC Control Task auf den Control Flow oder Sie überschreiben den vorherigen. Die Konfiguration ist dieselbe wie in Fig. 9, mit Ausnahme des CDC-Steuerungsbetriebs (#2). Wählen Sie dieses Mal Verarbeitungsbereich abrufen aus . Klicken Sie dann auf OK . Verbinden Sie dies später mit der Datenflussaufgabe in SCHRITT #3.

Bearbeiteten Bereich markieren

Konfigurieren Sie die andere CDC-Kontrollaufgabe wie die erste, außer dass Sie diesmal Verarbeiteten Bereich markieren auswählen für den CDC-Kontrollbetrieb. Verbinden Sie die Datenflussaufgabe in SCHRITT #3 damit.

Schritt Nr. 3. Ziehen Sie einen Datenfluss-Task und stellen Sie eine Verbindung zum CDCControl-Task her

Diese Datenflussaufgabe führt das Extrahieren und Laden aus, wie zuvor in Abbildung 3 zu sehen. Bevor wir uns mit den Details der einzelnen Schritte befassen, finden Sie hier eine Zusammenfassung:

A. Fügen Sie eine CDC-Quelle hinzu
B. Fügen Sie einen CDC-Splitter hinzu und verbinden Sie ihn mit der CDC-Quelle
C. Hinzufügen eines OLE DB-Befehls zum Löschen von Datensätzen
D. Fügen Sie ein OLE DB-Ziel hinzu, um Datensätze einzufügen
E. Fügen Sie einen weiteren OLE DB-Befehl hinzu, um Datensätze zu aktualisieren

Lassen Sie uns jetzt eintauchen.

A. Fügen Sie eine CDC-Quelle hinzu

Ziehen Sie eine CDC-Quelle Komponente mit den in Abbildung 9 unten gezeigten Einstellungen.

Nach den nummerierten Schritten in Abbildung 9 folgen die Details:

  1. Wählen Sie zuerst die ADO.Net-Verbindung aus, die wir in Abbildung 6 erstellt haben.
  2. Wählen Sie dann die CDC-aktivierte Tabelle sportsCarSales aus .
  3. Wählen Sie die Erfassungsinstanz dbo_SportsCarSales aus .
  4. Wählen Sie dann Netz für den CDC-Verarbeitungsmodus. Dadurch werden nur Nettoänderungen zurückgegeben. Eine detaillierte Beschreibung der einzelnen Verarbeitungsmodi finden Sie unter diesem Link. Sie können auch auf Vorschau klicken um zu sehen, welche Zeilen eingeschlossen werden.
  5. Wählen Sie die CDC-Statusvariable aus, die wir zuvor erstellt haben (Abbildung 9).
  6. Klicken Sie abschließend auf OK .
B. Fügen Sie einen CDC-Splitter hinzu und verbinden Sie ihn mit der CDC-Quelle

Die einzige Anforderung an einen CDC-Splitter ist eine CDC-Quelle davor. Schließen Sie also die CDC-Quelle an früher zu dieser Komponente. Dadurch werden die Änderungen in Einfügungen, Aktualisierungen und Löschungen getrennt.

C. Hinzufügen eines OLE DB-Befehls zum Löschen von Datensätzen

Zuerst müssen Sie diese Komponente als „Datensätze löschen“ kennzeichnen (siehe Abbildung 3). Verbinden Sie diesen dann mit dem CDC-Splitter. Wenn eine Eingabeaufforderung angezeigt wird, wählen Sie Ausgabe löschen aus für die Ausgabe und klicken Sie auf OK .

Konfigurieren Sie dann den OLE DB-Befehl Verbindungsmanager Tab. Siehe Abbildung 10.

Als nächstes in den Komponenteneigenschaften Geben Sie auf der Registerkarte den DELETE-Befehl für den SQLCommand an Eigentum. Der Befehl sollte so lauten:

DELETE FROM FactSportsCarSales
WHERE SalesID = ?

Siehe Screenshot in Abbildung 11 unten.

Das Fragezeichen erstellt einen Parameter für SalesID . Jede SalesID Wert, der vom CDCSplitter kommt wird verwendet, um Zeilen in FactSportsCarSales zu löschen Tabelle.

Dann in den Spaltenzuordnungen ordnen Sie die SalesID zu Spalte der Tabelle zum Parameter (Param_0 ) Siehe Abbildung 12.

Klicken Sie abschließend auf OK.

D. Hinzufügen eines OLE DB-Ziels zum Einfügen von Datensätzen

Ziehen Sie zuerst ein OLE DB-Ziel . Beschriften Sie es dann mit Datensätze einfügen . Verbinden Sie diesen mit dem CDC-Splitter . Wählen Sie dann Ausgabe einfügen aus wenn eine Fensteraufforderung erscheint. Siehe Abbildung 14 für die Grundeinstellungen.

Nach den nummerierten Schritten in Abbildung 13 finden Sie unten die Details:

  1. Wählen Sie zuerst die OLE DB-Verbindung aus, die wir in Abbildung 7 erstellt haben.
    Wählen Sie dann FactSportsCarSales aus Faktentabelle.
  2. Klicken Sie abschließend auf OK .
E. Hinzufügen eines OLE DB-Befehls zum Aktualisieren von Datensätzen

Ziehen Sie einen weiteren OLE DB-Befehl und beschriften Sie es mit Datensätze aktualisieren. Verbinden Sie es dann mit dem CDC-Splitter . Es wählt automatisch UpdateOutput Ausgang. Die Verbindungsmanager Tab-Einstellung sollte die gleiche sein wie in Abbildung 11.

Aber der Component PropertiesSQLCommand sollte einen Wert wie diesen haben:

UPDATE [dbo].[FactSportsCarSales]
   SET [ClientID] = ?
      ,[SportsCarID] = ?
      ,[PurchaseDate] = ?
      ,[Quantity] = ?
      ,[UnitPrice] = ?
 WHERE [SalesID]= ?

Die Anzahl der Fragezeichen im obigen Code sagt Ihnen, wie viele Parameter Sie verwenden müssen, beginnend mit Param_0 .Die Position der Parameter von Param_0 zu Param_5 ist basierend auf ihrer Position im Code angeordnet. Also Param_0 steht für ClientID , Param_1 ist für SportsCarID , und so weiter.

Sehen Sie sich die Spaltenzuordnungen an in Abbildung 15.

Nach dem Konfigurieren von CDC auf Datenbank- und Tabellenebene können Sie testen, ob CDC funktioniert, indem Sie Zeilen hinzufügen und ändern. Fügen wir der Tabelle also einige Datensätze hinzu.


USE SportsCarSales
GO

INSERT INTO SportsCarSales (ClientID, SportsCarID, PurchaseDate, Quantity, UnitPrice)
	VALUES (1, 1920, '02/03/2022', 1, 845000.0000),
	(5, 1920, '01/22/2022', 1, 845000.0000),
		(54, 1920, '01/15/2022', 1, 845000.0000),
		(62, 1920, '02/04/2022', 1, 845000.0000);
GO

Um zu sehen, ob dies in CDC aufgezeichnet ist, fragen Sie cdc.dbo_sportsCarSales_CT ab Tabelle.

SELECT * FROM cdc.dbo_sportsCarSales_CT;

Sehen Sie sich die Ergebnisse in Change Data Capture nach dem INSERT-Befehl in Abbildung 15 an.

Also hat es die Inserts aufgezeichnet. Das ist gut.

Versuchen Sie jetzt, das SSIS-Paket früher auszuführen. Das Ergebnis sollte das gleiche wie in Abbildung 16 unten sein.

Abbildung 16 . Laufzeitergebnis des SSIS-Pakets für inkrementelles Laden mit CDC.

Und schließlich die Abfrage der Ergebnisse in FactSportsCarSales Tabelle zeigt denselben Satz von 4 Datensätzen.

Inkrementelles Laden in SSIS mit DateTime-Spalten

Inkrementelles Laden in SSIS mit DateTimecolumns ist eine weitere Möglichkeit, Daten in Inkrementen zu sammeln. Wenn Sie ETL in einer Tabelle ohne CDC ausführen, ist dies Ihre nächste Option.

Die Quelltabelle kann ein Geändert haben oder LetzteAktualisierung Spalte wie in Abbildung 17.

Um die Änderungen abzufragen, muss man das Maximum Geändert kennen Spaltenwert vom Ziel. Fragen Sie dann alle Datensätze aus der Quelle ab, die größer als Geändert sind Spaltenwert vom Ziel.

Die typischen Bestandteile dieser Technik sind in Abbildung 18 dargestellt.

Bitte befolgen Sie die Anweisungen zum Garen dieser Art von inkrementeller Beschickung. Im Folgenden finden Sie die Unterthemen für diesen Abschnitt:

  • Erstellen des Pakets für inkrementelles SSIS-Laden mit DateTime-Spalten
  • Laufzeitergebnisse des Pakets

Erstellen des Pakets für das inkrementelle Laden von SSIS mit DateTime-Spalten

Unser Ziel ist es, die SportsCars zu laden Tabelle in dimSportsCars Dimensionstabelle in einer anderen Datenbank. Im Folgenden finden Sie eine Zusammenfassung der Schritte:

SCHRITT 1. Erstellen Sie 2 OLE DB-Verbindungs-Manager
SCHRITT 2. Erstellen Sie 2 Paketvariablen
SCHRITT 3. Fügen Sie eine SQL-Aufgabe ausführen hinzu im Kontrollfluss
SCHRITT 4. Fügen Sie eine Datenflussaufgabe hinzu

Fangen wir an.

SCHRITT #1. Erstellen Sie 2 OLE DB-Verbindungsmanager

Die erste OLE DB-Verbindung stammt von einer Transaktionsdatenbank. Und die Einstellungen sind einfach, wie in Abbildung 19 gezeigt.

Erstellen Sie dann eine weitere OLE DB-Verbindung zum Data Warehouse. Dies sollte dasselbe wie in Abbildung 7 sein.

SCHRITT #2. Erstellen Sie 2 Paketvariablen

Die erste Variable enthält das Datum der letzten Änderung von dimSportsCars Maßtabelle. Dann enthält die zweite die benutzerdefinierte SQL-Abfrage.

A. Erstellen Sie die Variable User::sportsCars_lastUpdate
  1. In den Variablen Klicken Sie im Fenster auf Variable hinzufügen .
  2. Nennen Sie es sportsCars_lastupdate .
  3. Setzen Sie den Datentyp auf DateTime .
B. Erstellen Sie die User::sqlCommand-Variable
  1. In den Variablen Klicken Sie im Fenster auf Variable hinzufügen .
  2. Nennen Sie es sqlCommand .
  3. Setzen Sie den Typ auf String .
  4. Klicken Sie auf die Schaltfläche mit den Auslassungspunkten, um den Ausdruck zu erstellen . Siehe Abbildung 21 für den Expression Builder Fenster und den eigentlichen String-Ausdruck.
  5. Klicken Sie auf OK .

Der SQL-String sollte folgendermaßen aussehen:

"SELECT  SportsCarID, StyleID, ManufacturerID, Model, UnitPrice, created, modified 
FROM sportsCars
WHERE modified > '" + (DT_WSTR, 50) @[User::sportsCars_lastupdate]  + "' 
ORDER BY SportsCarID;"

Beachten Sie, dass wir die WHERE-Klausel auf Modified gesetzt haben größer als User::sportsCars_lastupdate .

Weitere Einzelheiten zum Einstellen der beiden Variablen finden Sie in den folgenden Schritten.

SCHRITT #3. Fügen Sie eine Aufgabe zum Ausführen von SQL in der Ablaufsteuerung hinzu

Diese Aufgabe fragt die Zieltabelle ab, um die letzte Geändert abzurufen Datumswert. Ziehen Sie eine SQL-Aufgabe ausführen zum Kontrollfluss. Beschriften Sie es dann mit Get Last Modified Date from DW . Sehen Sie sich dann die Einstellungen in Abbildung 21 an.

Die wichtigen Eigenschaften, die hier eingestellt werden müssen, sind die Verbindung , SQL-Anweisung und ResultSet Eigenschaften.

Stellen Sie die Verbindung ein -Eigenschaft auf die zweite OLE DB-Verbindung, die in SCHRITT 1 festgelegt wurde. Legen Sie dann das SQLStatement fest -Eigenschaft auf den folgenden Code.

select max(modified) as LastUpdate from dimSportsCars

Legen Sie dann das ResultSet fest -Eigenschaft in eine Einzelne Zeile .

Schließlich müssen Sie das LastUpdate zuordnen Spaltenalias (siehe Code oben) an User::sportsCars_lastupdate Variable. Siehe Screenshot in Abbildung 22.

Klicken Sie abschließend auf OK um die neuen Einstellungen zu speichern.

SCHRITT #4. Fügen Sie eine Datenflussaufgabe hinzu

Ziehen Sie eine Datenflussaufgabe zur Ablaufsteuerung und verbinden Sie den Task „SQL ausführen“ dazu. Benennen Sie dann die Datenflussaufgabe dimSportsCars-Dimension aktualisieren . Befolgen Sie dann die Schritte zum Hinzufügen von Komponenten zur Datenflussaufgabe .

Die Datenflussaufgabe enthält mehrere Schritte:

A. Fügen Sie eine OLE DB-Quelle hinzu
B. Fügen Sie eine Lookup-Umwandlung hinzu, um die Quelle mit dem Ziel zu vergleichen
C. Hinzufügen eines OLE DB-Befehls zum Aktualisieren von Datensätzen
D. Hinzufügen eines OLE DB-Ziels zum Einfügen von Datensätzen

Fangen wir jetzt an.

A. Hinzufügen einer OLE DB-Quelle

Diese OLE DB-Quelle fragt die Quelltabelle nach den geänderten Datensätzen ab. Siehe die Einstellungen in Abbildung 23.

Nach den Nummern in Abbildung 23 folgen die Details:

  1. Geben Sie zuerst die von uns erstellte OLE DB-Verbindung an. Siehe Abbildung 20.
  2. Stellen Sie dann den Datenzugriffsmodus ein zu SQL-Befehl von die Variable .
  3. Wählen Sie dann die Variable User::sqlCommand aus, die wir zuvor erstellt haben. Siehe Abbildung 21.
  4. Klicken Sie abschließend auf OK .
B. Fügen Sie eine Lookup-Umwandlung hinzu, um die Quelle mit dem Ziel zu vergleichen

Jetzt brauchen wir eine Möglichkeit, die Quell- und Zieltabellen zu vergleichen. Wir können die Suche verwenden Transformationskomponente, um das zu tun. Dadurch wird eine Verbindung zwischen den beiden Tabellen hergestellt.

Ziehen Sie also eine Suche Transformation im Datenfluss und nennen Sie sie Änderung klassifizieren . Verbinden Sie es dann mit der OLE DB-Quelle vorhin. Doppelklicken Sie darauf. Siehe Abbildung 24 zum Einrichten von Allgemein Seite.

Setzen Sie das Dropdown-Menü auf Zeilen auf Ausgabe ohne Übereinstimmung umleiten wie in Abbildung 24 zu sehen. Das bedeutet, dass wir die Zeilen verwenden werden, die keine Übereinstimmung haben. Und in diesem Fall dient dies zum Erkennen von Zeilen, die in der Quelle, aber nicht im Ziel vorhanden sind.

Klicken Sie als Nächstes auf Verbindung Seite im linken Bereich des Lookup Transformation Editor . Sehen Sie sich dann Abbildung 25 an, was einzustellen ist.

In Abbildung 26 müssen Sie die OLE DB-Verbindung für die Zieltabelle angeben. (Siehe Abbildung 7). Legen Sie dann die SQL-Abfrage auf den folgenden Code fest.

SELECT SportsCarID from dimSportsCars

Wir benötigen nur die SportsCarID Spalte zu vergleichen, also haben wir eine Abfrage statt der ganzen Tabelle verwendet.

Klicken Sie als Nächstes auf die Spalten Seite, um die Zuordnung der Schlüsselspalte der Quellabfrage zum Ziel festzulegen. Siehe Abbildung 26 für die Zuordnung.

Wie in Abbildung 26 zu sehen, sollte es eine Linie von der Quelle zum Ziel geben, die die SportsCarID verwendet Schlüsselspalte. Beide Schlüsselspalten werden für den Vergleich verwendet.

Klicken Sie abschließend auf OK .

C. Hinzufügen eines OLE DB-Befehls zum Aktualisieren von Datensätzen

Dieser Teil aktualisiert die Datensätze mit übereinstimmender SportsCarID Schlüsselwerte aus der Suche Umwandlung.

Ziehen Sie also einen OLE DB-Befehl im Datenfluss und nennen Sie es DimSportsCars aktualisieren . Verbinden Sie es dann mit der Suche Verwandlung früher. Wenn eine Eingabeaufforderung angezeigt wird, legen Sie die Ausgabe fest um Match-Ausgabe nachzuschlagen . Klicken Sie dann auf OK .

Doppelklicken Sie auf den OLE DB-Befehl und legen Sie die Eigenschaften in den Verbindungsmanagern fest Tab. Siehe Abbildung 27.

Abbildung 27 zeigt, dass Sie den Verbindungsmanager einstellen müssen in die Zieldatenbank (siehe Abbildung 8). Klicken Sie dann auf die Komponenteneigenschaften Tab. Siehe Abbildung 28 für die Eigenschaftseinstellungen.

Die SQLCommand-Eigenschaft ist auf:

festgelegt
UPDATE dimSportsCars
SET StyleID = ?, ManufacturerID = ? , MODEL = ? , UnitPrice = ? , modified = ?
WHERE SportsCarID = ?

Etwas Ähnliches haben wir früher schon gemacht. Die Fragezeichen sind Parameterplatzhalter. Und wenn wir die richtige Quellspalte zuordnen, wird die entsprechende Zielspalte gesetzt. Siehe die Zuordnungen in Abbildung 29.

Klicken Sie abschließend auf OK .

D. Hinzufügen eines OLE DB-Ziels zum Einfügen von Datensätzen

Dieser Teil fügt neue Rekorde ein, die in den SportsCars gefunden wurden Tabelle in die dimSportsCars Dimensionstabelle.

Ziehen Sie also ein OLE DB-Ziel Komponente und nennen Sie sie Insert New Records in dimSportsCars. Doppelklicken Sie darauf und legen Sie die Verbindungs- und Zieltabelle fest. Siehe Abbildung 30.

Stellen Sie wie in Abbildung 30 gezeigt die Verbindung zum Data Warehouse (Abbildung 8) her und wählen Sie dimSportsCars aus Maßtabelle.

Klicken Sie als Nächstes auf Zuordnungen page, um zu sehen, ob die Spalten entsprechend zugeordnet sind. Da die Spaltennamen in Quelle und Ziel gleich sind, werden sie automatisch zugeordnet.

Klicken Sie abschließend auf OK .

Ergebnisse der Paketlaufzeit

Nachdem das Paket nun vollständig ist, sehen Sie hier einen Screenshot des Ergebnisses in Abbildung 31.

Der Prozess hat 8 Zeilen aktualisiert und 1 neue Zeile in dimSportsCars eingefügt Maßtabelle.

Inkrementelles Laden in SSIS mit Lookup

Eine andere Methode zum inkrementellen Laden besteht darin, die Quelle mit dem Ziel zu vergleichen, um zu sehen, was eingefügt, aktualisiert und gelöscht werden muss. Und dies ist Ihre Option, wenn es keine DateTime-Spalte und keine CDCon-Tabellen gibt. Eine Möglichkeit hierfür ist die Verwendung von Lookup Umwandlung.

Die typischen Bestandteile dieses Ansatzes sind in Abbildung 32 dargestellt.

Beachten Sie, dass der einfache Ansatz in Abbildung 32 für Tabellen gilt, die keine endgültigen Löschungen zulassen. Wenn Löschungen verarbeitet werden müssen, kann ein Zusammenführungs-Join unter Verwendung eines vollständigen Joins anwendbar sein.

Es gibt 2 Unterthemen für diesen Abschnitt:

Erstellen des SSIS-Pakets für das inkrementelle Laden von SSIS mithilfe von Lookup
Laufzeitergebnisse des Pakets

Tauchen wir ein.

Erstellen des SSIS-Pakets für das inkrementelle Laden von SSIS mithilfe der Suche

Unser Ziel hier ist es, die Reihen der Hersteller zu laden Tabelle in die dimManufacturers Dimensionstabelle.

Dies setzt voraus, dass Sie ein leeres SSIS-Paket bereit haben.

Im Folgenden finden Sie eine Zusammenfassung der Schritte:

SCHRITT 1. Erstellen Sie 2 OLE DB-Verbindungen
SCHRITT 2. Fügen Sie eine Datenflussaufgabe hinzu

Beginnen wir mit dem Beispiel.

SCHRITT #1. Erstellen Sie 2 OLE DB-Verbindungen

Abbildung 19 zeigt die Quelle und Abbildung 7 das Ziel. Wir verwenden hier dieselben Connection Manager.

SCHRITT #2. Fügen Sie eine Datenflussaufgabe hinzu

Ziehen Sie eine Datenflussaufgabe in der Ablaufsteuerung und nennen Sie sie Hersteller-Dimensionstabelle aktualisieren. Doppelklicken Sie darauf und folgen Sie den nächsten Schritten. Nachfolgend sind die Schritte innerhalb der Datenflussaufgabe zusammengefasst .

A. Fügen Sie eine OLE DB-Quelle hinzu
B. Fügen Sie eine Suche hinzu Transformation zum Scannen nach neuen Datensätzen
C. Fügen Sie ein OLE DB-Ziel hinzu Aufzeichnungen einzufügen.
D. Fügen Sie eine weitere Suche hinzu Transformation zum Scannen nach Änderungen
E. Fügen Sie einen OLE DB-Befehl hinzu um die Zieltabelle zu aktualisieren

A. Fügen Sie eine OLE DB-Quelle hinzu

Ziehen Sie eine OLE DB-Quelle und kennzeichnen Sie es mit Hersteller . Richten Sie den Verbindungsmanager ein wie in Abbildung 33 zu sehen.

B. Fügen Sie eine Lookup-Umwandlung hinzu, um nach neuen Datensätzen zu suchen

Diese Suche Transformation scannt basierend auf der ManufacturerID nach Datensätzen, die im Ziel nicht vorhanden sind Schlüsselspalte. Und alle nicht übereinstimmenden Zeilen sind Kandidaten für die Tabelleneinfügung.

Ziehen Sie eine Suche Transformationund nennen Sie es Lookup dimManufacturers. Doppelklicken Sie dann darauf.

Die Einstellungen für das Allgemein Seite sollte dieselbe wie in Abbildung 24 sein. Stellen Sie in der Zwischenzeit die Verbindung zum Data Warehouse ein und verwenden Sie eine Abfrage für die Verbindungen Seiteneinstellungen. Siehe Abbildung 34.

C. Hinzufügen eines OLE DB-Ziels zum Einfügen von Datensätzen

Ziehen Sie ein OLE DB-Ziel und nennen Sie es Neue Datensätze einfügen. Verbinden Sie es mit der Suche Transformation und wählen Sie Lookup No Match Output aus wenn eine Eingabeaufforderung erscheint. Doppelklicken Sie darauf und stellen Sie die Verbindung und die Zieltabelle ein, wie in Abbildung 35 zu sehen.

Die Quell- und Zieltabellen haben dieselben Spaltennamen und werden automatisch zugeordnet. Siehe Abbildung 36.

Klicken Sie abschließend auf OK .

D. Fügen Sie eine weitere Lookup-Umwandlung hinzu, um nach Änderungen zu suchen

Im Gegensatz zum vorherigen Lookup Transformation, diese scannt nach Änderungen im Hersteller Säule. Und wenn es Änderungen gibt, ist es ein Kandidat für die Tabellenaktualisierung.

Ziehen Sie eine weitere Suche Transformation und nennen Sie sie Lookup Records that Changed. Verbinden Sie es mit dem ersten Lookup Transformation. Der General Seite für diese Suche sollte dieselbe sein wie in Abbildung 24.

Inzwischen ist die Verbindung Seite sollte wie in Abbildung 37 unten aussehen.

Beachten Sie in der Zwischenzeit die Zuordnungen in Abbildung 38.

Abbildung 38 zeigt Zuordnungen durch Hersteller Name. Wenn es nicht gleich ist, gibt es eine Änderung in der Quelle. Und es muss in das Ziel kopiert werden.

E. Fügen Sie einen OLE DB-Befehl hinzu, um die Zieltabelle zu aktualisieren

Die Einstellungen sollten dieselben wie in Abbildung 29 sein, mit Ausnahme des SQLCommand . Der UPDATE-Befehl sollte wie folgt aussehen:

UPDATE dimManufacturers
set manufacturer = ?
where manufacturerID = ?

Passen Sie die Spaltenzuordnungen zu den Parametern entsprechend an.

Ergebnisse der Paketlaufzeit

Erledigt? Führen Sie dann das Paket aus. Sie sehen die gleichen Laufzeitergebnisse wie in Abbildung 39.

Das beste Tool zum Laden von SSIS-Daten

Alle Beispiele, die wir zuvor hatten, verwenden die sofort einsatzbereiten Komponenten von Microsoft. Auch wenn es für einige Projekte gut genug ist, was ist, wenn Sie sowohl Cloud- als auch Datenbankquellen über SSIS integrieren müssen?

Hier kommen Devart SSIS-Komponenten ins Spiel. Diese SSIS-Komponenten sind bequem zu verwenden. Und sie bieten leistungsstarkes Laden von Daten durch datenquellenspezifische Optimierungen und erweitertes Caching. Sie haben auch mehr als 40 Datenquellen, einschließlich RDBMS-Favoriten wie MySQL, PostgreSQL und Oracle. Ebenfalls enthalten sind Cloud-Dienste wie Salesforce, HubSpot, Google Analytics und vieles mehr. Es ist also einen Versuch wert, mit Devart SSIS-Komponenten Millionen von Datensätzen in SSIS zu laden.

Warum kein Beispiel?

Verwenden von Devart-SSIS-Komponenten für inkrementelles Laden

Versuchen wir, die dimManufacturers zu replizieren Tabelle in MySQL und verwenden Sie Devarts Lookup und Ziel Komponenten für MySQL. Das Rezept ist in Abbildung 40 dargestellt.

Beginnen wir mit dem Hinzufügen eines neuen SSIS-Pakets zu Ihrem Visual Studio Integration Services-Projekt. Fügen Sie dann eine Datenflussaufgabe hinzu und doppelklicken Sie darauf. Führen Sie dann die folgenden Schritte aus.

Zuvor finden Sie hier eine Zusammenfassung der Schritte:

SCHRITT 1. Fügen Sie eine OLE DB-Quelle hinzu
SCHRITT 2. Fügen Sie einen Devart MySQL Connection Manager hinzu
SCHRITT 3. Fügen Sie eine Devart-MySQL-Suche hinzu um nach neuen Aufzeichnungen zu suchen
SCHRITT 4. Fügen Sie eine weitere Devart-MySQL-Suche hinzu Transformation, um nach Änderungen zu suchen
SCHRITT #5. Fügen Sie ein Devart-MySQL-Ziel hinzu Aufzeichnungen einzufügen
SCHRITT #6. Add another Devart MySQL Destination to update records

STEP #1. Add an OLE DB Source

This will connect to the SQL Server database we had earlier. Please refer to Figure 8. Then, set the table to dimManufacturers .

STEP #2. Add a Devart MySQL Connection Manager

We need this connection for the destination database and table. So, in the Connection Managers window, right-click and select New Connection . Then, select the DevartMySQL Connection Manager type. Then, configure the database access as shown in Figure 41. Notice the simpler interface to connect. Though you can go to the Advanced tab and see more properties there.

I’m running MySQL 8 in my local machine and there’s a copy of the same database in SQL Server, but the rows are older.

STEP #3. Add a Devart MySQL Lookup Transformation to Scanfor New Records

Drag a Devart MySQL Lookup and name it Compare Source to Target . Then, connect it to the Devart MySQL Connection Manager vorhin. Now, follow the configuration in Figure 42.

Following the numbers in Figure 42, the following are the details:

  1. First, select the Devart MySQL Connection Manager created in STEP #2.
  2. Then, select the dimmanufacturers Tabelle.
  3. In Lookup Columns , mark checked the ManufacturerID column.
  4. Then, in Input Columns , select ManufacturerID .
  5. Then, select ManufacturerID in Reference Columns .
  6. Finally, click OK .

HINWEIS :If you encounter a duplicate name error, go to Advanced Editor. And then, click Input and Output Properties . Rename either the Input or Output Column to a different name.

STEP #4. Add another Devart MySQL Lookup Transformation toScan for Changes

This second MySQL Lookup will scan forrecords that changed.

Drag another Devart MySQL Lookup andlabel it Get Records that Changed. Connect it to thefirst Devart MySQL Lookup . Then, choose Lookup Match Output .

The setup is the same as in Figure 42. But choose the Manufacturer column instead of ManufacturerID . Do this for Lookup Columns , Input Columns , and Reference Columns .

STEP #5. Add a Devart MySQL Destination to Insert Records

This step will insert records from thesource that have no match in the target.

So, drag a Devart MySQL Destination and label it Insert New Records. Connect it to the first Devart MySQL Lookup . Double-click it and configure the Connection Manager . See Figure 43.

In Figure 43, you need to set the connection to the MySQL connection manager we did in STEP #2. Then, click Component Properties . See the configuration in Figure 44.

After setting the TableName to dimmanufacturers ,click Column Mappings . Since both the source and target tables havethe same column names, the columns are automatically mapped.

Finally, click OK .

STEP #6. Add Another Devart MySQL Destination to UpdateRecords

Unlike the other Devart MySQLDestination , this will update records that changed from the source.

So, drag another Devart MySQL Destination and label it Update Existing. Connect it to the second Devart MySQL Lookup Transformation. And select Lookup No Match Output when a prompt appears. The setup is the same as in STEP #5 except for the Component Properties . See Figure 45 on what to change.

Using the Devart MySQL Destination is dead easy than using an OLE DB Command. There’s no need to map parameters to columns. It also works for a Delete operation. This is unlike an OLE DB Destination that works for inserts only.

Package Runtime Results

See the runtime results in Figure 46.

Schlussfolgerung

That’s it.

You learned 3 ways to do incremental load in SSIS by using the following:

  • Change Data Capture
  • DateTime Columns
  • Lookup Transformation

You also learned how to do it using DevartSSIS Components.

Though our examples are simplified to makethe principle easier to understand as possible, there’s room for improvement.We didn’t use a staging table to store all changes, whether insert, update, ordelete. This is recommended for very large data, especially when the target isin another server. You can also add an executeprocess task in SSIS for special scenarios.

Anyway, if you like this post, please shareit on your favorite social media platforms.