sql >> Databasteknik >  >> RDS >> Database

Inkrementell belastning i SSIS

Folk har allt mer bråttom. De vill ha sina uppgifter nästan just nu. Och ännu mer, data blir större och större. Så du kan inte använda gamla bra tekniker eftersom de är "tillräckligt bra". Det måste vara snabbt. Och ETL-steg är inte ett undantag. Det är här inkrementell belastning kommer att spela. Och om du är på den här sidan letar du förmodligen efter inkrementell belastning i SSIS.

Och det är vårt fokus i den här artikeln. Vi kommer att göra jämförelser och exempel för att förklara inkrementell databelastning i SSIS steg för steg. Och var säker på att det inte kommer att knäcka ditt huvud när du kommer på det här.

Här är vad som väntar dig:

  • Vad är full belastning och inkrementell belastning i ETL?
  • Vad är inkrementell dataladdning i SSIS?
  • Skillnaderna mellan full belastning och inkrementell belastning i SSIS
  • Inkrementell belastning i SSIS med CDC eller Change Data Capture
  • Inkrementell belastning i SSIS med DateTime-kolumner
  • Hur man gör inkrementell laddning i SSIS med hjälp av Lookup
  • Det bästa verktyget för SSIS-dataladdning

Varje sektion kommer att ha underavdelningar. Du kan hoppa till det ämne du behöver genom att klicka på länkarna.

Innan vi börjar med exemplen, låt oss jämföra inkrementell belastning med dess motsats, full belastning.

Vad är full belastning och inkrementell belastning i ETL

Oavsett vilka ETL-verktyg du använder, har fulla och inkrementella belastningar samma betydelse. Låt oss beskriva dem nedan.

Full belastning i ETL

Som namnet antyder laddar Full Load i ETL ALL data från källan till destinationen. En måltabell trunkeras innan allt laddas från källan. Det är därför den här tekniken också är känd som Destruktiv belastning . Denna teknik är också lättare att göra. Och detta säkerställer också högsta dataintegritet. Men storleken på din data idag är större än igår. Så om du använder detta på ständigt växande data kommer processen att bli långsammare med tiden.

ETL Full Load Use Cases

  • Storleken på källdata är liten och kommer inte att växa nämnvärt på många år framöver. Exempel inkluderar en lista med färger, några kategorier/klassificeringar, lista över länder och städer och många fler.
  • Det är svårt att säga vilken som är ny eller ändrad i källan.
  • Data måste vara exakt samma från källan till destinationen
  • Datahistoriken är irrelevant och skrivs över oftare

Inkrementell belastning i ETL

Samtidigt är Incremental Load som namnet antyder också. Endast data som ändrats kommer att laddas från källan till destinationen. Detta görs stegvis över tiden. De som inte ändrades kommer att förbli som de är. Det här är lite svårt att göra. Du måste se till att alla ändringar har samlats in och laddats till destinationen. Men detta kommer att köras snabbare än Full Load på mycket stora data.

ETL Incremental Load Use Cases

  • Datastorleken är mycket stor och sökningen kommer att vara mycket långsam för stora resultatuppsättningar
  • Ändringar är lätta att fråga
  • Raderad data måste behållas på destinationen, som ett revisionssystem

Vad är inkrementell belastning i SSIS

De grundläggande beståndsdelarna av en inkrementell belastning i SSIS visas i figur 1.

Inkrementell laddning i SSIS tenderar att vara mer komplex beroende på dina krav. Men det enkla "receptkortet" i figur 1 innehåller det du behöver för att "laga" data i steg. Att fånga förändringar i data är den utmanande delen. Du kan förstöra destinationen om du inte är försiktig.

I de efterföljande avsnitten kommer du att se hur du gör inkrementell belastning i SSIS med exempel. Dessa inkluderar användning av ChangeData Capture (CDC), DateTime-kolumner och uppslagningar. Du kommer också att se hur detta görs med Devart SSIS-komponenter.

Låt oss jämföra inkrementell belastning med full belastning i SSIS i nästa avsnitt.

Skillnaden mellan full belastning och inkrementell belastning i SSIS

Du har redan sett hur inkrementell belastning ser ut i SSIS (Figur 1). Under tiden, så här går det med SSIS Full load i figur 2 nedan.

Skillnaden mellan full belastning och inkrementell belastning i SSIS ligger i paketets design. En fulllastdesign kräver färre komponenter som dras in i SSIS-paketet. Det är så enkelt att det är lite tänkande inblandat. Det är därför på grund av en falsk känsla av produktivitet tenderar vissa utvecklare att tillgripa denna teknik för det mesta.

Men att köra ett fulladdat designpaket varje natt är inte tillrådligt för stora data, säg 15TB. Tror du att det kommer att sluta i tid innan användarna anländer på morgonen? Det kommer inte att hända eftersom du försöker infoga de poster som inte ändrades alls. Om det är runt 70 % av datan behöver du mer driftstopp beroende på serverresurser.

Det är oacceptabelt.

Så desto mer behöver du använda inkrementell belastning på dessa scenarier. I följande avsnitt kommer du att lära dig hur du laddar data snabbare med inkrementell belastning.

Inkrementell belastning inSSIS med CDC

Låt oss först överväga att använda Change Data Capture (CDC). Observera att från här till nästa 3 exempel kommer vi att använda enkla exempel. Så paketdesignen kommer inte att sudda ut målet.

Innan vi börjar med exemplet kommer detta avsnitt att täcka följande:

  • Först, hur man aktiverar CDC i en databas och tabell
  • Skapa sedan SSIS-paketet för SSIS inkrementell belastning med CDC
  • Äntligen, kör och kontrollera resultaten

Figur 3 visar beståndsdelarna i detta exempel.

Change Data Capture (CDC) registrerar infogar, raderingar och uppdateringar i en tabell. Innan du kan få det här exemplet att fungera behöver du en databas och en tabell som är konfigurerad för CDC.

Hur man aktiverar CDC i en databas och tabell

Databas- och tabellinställningar är som standard utan CDC. För att göra en databas CDC-aktiverad, här är T-SQL-syntaxen:

-- 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

Sedan, för att kontrollera om CDC verkligen är aktiverat, kör detta:

select name from sys.databases
where is_cdc_enabled=1

Om namnet på databasen du aktiverade för CDC visas är du bra att gå. Din databas är nu CDC-aktiverad.

Men det slutar inte här. Du måste ange vilken tabell du vill spåra för eventuella ändringar. sp_cdc_enable_table kommer att göra susen. Nedan är ett exempel på det.

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

Att köra ovanstående kod bör resultera i liknande meddelanden nedan:

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

Dessa meddelanden är de 2 nya SQL Server Agent-jobb som skapats efter aktivering av en tabell för CDC. Det är därför du behöver SQL Server Agent för att få CDC att fungera. Se en skärmdump i figur 4.

Göra insättningar, raderingar och uppdateringar på sportbilsförsäljningen tabellen registrerar automatiskt ändringarna i en annan tabell med namnet cdc.dbo_sportsCarSales_CT . Den här tabellen har kolumner som originalet. Se en skärmdump i figur 5.

_$operationen kolumnen i den vänstra tabellen är av särskilt intresse. Möjliga värden för denna kolumn är 1(Radera), 2 (Infoga), 3 och 4 (Uppdatera). Uppdateringen använder två värden:ett för kolumnvärden före uppdateringen (det är 3). Och den andra för kolumnvärden efter uppdateringen (det är 4). Du kan kontrollera den här kolumnen när du kontrollerar värdena innan du kör ditt SSIS-paket. CDCSource och CDC Splitter komponenter använder den här tabellen när de identifierar ändringar. Mer om dessa i nästa avsnitt.

Skapa SSIS-paketet för SSIS inkrementell belastning med CDC

Här är stegen för att skapa SSIS-paketet med inkrementell belastning med CDC. Detta förutsätter att du redan har ett tomt paket i Visual Studio 2019. Vårt mål här är att ladda raderna från sportsCarSales ta del av FactSportsCarSales faktatabell i ett datalager.

Följande är en sammanfattning av stegen:

STEG 1. Skapa 2 databasanslutningshanterare
STEG 2. Dra 2 CDC Control Task till kontrollflödet
STEG 3. Dra en dataflödesuppgift och anslut till CDC-kontrolluppgiften

STEG #1. Skapa 2 databasanslutningshanterare

Vi behöver 2 databasanslutningar här. En är ADO.Net-anslutningen som ska peka till den CDC-aktiverade databasen. Och skapa sedan en OLE DB-anslutning till ett datalager som destination. Båda är SQL Server 2019-databaser. Se figurerna 6 och 7 i enlighet därmed. I det här exemplet finns båda databaserna på samma maskin. Och vi använder Windows-autentisering för att ansluta.

Så i Anslutningshanterare högerklicka och välj Ny ADO.Net-anslutning . Fyll sedan i server-, autentiserings- och databasinställningarna som visas i figur 6 nedan.

Skapa sedan en OLE DB-anslutning till datalagret. I fönstret Anslutningshanteraren högerklickar du och väljer Ny OLE DB-anslutning . Fyll sedan i servern, autentiseringen och databasnamnet. Ange datalager här.

STEG #2. Dra 2 CDC Control Task till kontrollflödet

Det finns två saker vi måste göra efter att ha dragit en CDC-kontrolluppgift i kontrollflödet.

Markera CDC Start

Först måste vi konfigurera CDC Control Task för att markera CDC Start. Och skapa sedan en CDC State-tabell. Detta kan göras i ett konfigurationsfönster. Se figur 8 nedan.

Följande de numrerade stegen i figur 9 är följande detaljer.

  1. Välj ADO.Net-anslutningen som vi skapade i figur 6.
  2. Välj sedan Markera CDC-start .
  3. Klicka på Ny för att skapa en CDC-tillståndsvariabel. Sedan visas ett fönster. Klicka på OK för att skapa standardvariabelnamnet User::CDC_State .
  4. Välj ADO.Net-anslutningen så att vi kan lagra CDC-tillståndet i den databasen.
  5. Klicka på Ny för att skapa en tabell för att lagra tillstånd. Skriptet är redan skapat åt dig. Så klicka bara på Kör i nästa fönster.
  6. Välj sedan CDC_State som statens namn.
  7. Klicka slutligen på OK .

Efter att ha konfigurerat denna CDC Control Task, kör paketet. Du kommer inte att se poster kopierade till den andra databasen än. Men tillståndstabellen (dbo.cdc_state ) kommer att fyllas i med initiala värden.

Härifrån kan du välja att inaktivera denna CDC-kontrolluppgift eller skriva över den igen med nya värden i nästa uppgift.

Hämta bearbetningsintervall

Antingen drar du en ny CDC-kontrolluppgift till kontrollflödet eller skriver över den föregående. Konfigurationen är densamma som i figur 9, förutom CDC Control Operation (#2). Den här gången väljer du Hämta bearbetningsintervall . Klicka sedan på OK . Anslut detta till dataflödesuppgiften i STEG #3 senare.

Markera bearbetat intervall

Konfigurera den andra CDC-kontrolluppgiften som den första, förutom den här gången väljer du Markera bearbetat intervall för CDC Control Operation. Anslut dataflödesuppgiften i STEG #3 till detta.

Steg #3. Dra en dataflödesuppgift och anslut till CDCControluppgiften

Denna dataflödesuppgift kommer att utföra extraheringen och laddningen som ses i figur 3 tidigare. Innan vi dyker in i detaljerna för varje steg, här är en sammanfattning:

A. Lägg till en CDC-källa
B. Lägg till en CDC-delare och anslut den till CDC-källan
C. Lägg till ett OLE DB-kommando för att radera poster
D. Lägg till en OLE DB-destination för att infoga poster
E. Lägg till ytterligare ett OLE DB-kommando för att uppdatera poster

Nu, låt oss dyka in.

A. Lägg till en CDC-källa

Dra en CDC-källa komponent med inställningar som visas i figur 9 nedan.

Följande de numrerade stegen i figur 9 är följande detaljer:

  1. Välj först ADO.Net-anslutningen som vi skapade i figur 6.
  2. Välj sedan den CDC-aktiverade tabellen sportsCarSales .
  3. Välj infångningsinstansen dbo_SportsCarSales .
  4. Välj sedan Net för CDC-bearbetningsläge. Detta kommer endast att returnera nettoförändringar. För en detaljerad beskrivning av varje bearbetningsläge, kolla in den här länken. Du kan också klicka på Förhandsgranska för att se vilka rader som kommer att ingå.
  5. Välj CDC State-variabeln som vi skapade tidigare (Figur 9).
  6. Klicka slutligen på OK .
B. Lägg till en CDC-delare och anslut den till CDC-källan

Det enda kravet för en CDC Splitter är en CDC-källa före den. Så anslut CDC-källan tidigare till denna komponent. Detta kommer att separera ändringarna för infogningar, uppdateringar och borttagningar.

C. Lägg till ett OLE DB-kommando för att ta bort poster

Först måste du märka den här komponenten som Ta bort poster (se figur 3). Anslut sedan detta till CDC Splitter. När en uppmaning visas väljer du DeleteOutput för utdata och klicka på OK .

Konfigurera sedan OLE DB-kommandot Anslutningshanterare flik. Se figur 10.

Därefter i Komponentegenskaper fliken, ange kommandot DELETE för SQLCommand fast egendom. Kommandot bör vara så här:

DELETE FROM FactSportsCarSales
WHERE SalesID = ?

Se en skärmdump i figur 11 nedan.

Frågetecknet skapar en parameter för Sälj-ID . Varje försäljnings-ID värde som kommer från CDCSplitter kommer att användas för att ta bort rader i FactSportsCarSales bord.

Sedan i kolumnmappningar mappa försäljnings-ID kolumnen i tabellen till parametern (Param_0 ) Se figur 12.

Klicka slutligen på OK.

D. Lägg till en OLE DB-destination för att infoga poster

Dra först en OLE DB-destination . Namnge det sedan Infoga poster . Anslut denna till CDC Splitter . Välj sedan InsertOutput när en fönsterprompt visas. Se figur 14 för grundinställningarna.

Följ de numrerade stegen i figur 13, nedan är detaljerna:

  1. Välj först OLE DB-anslutningen som vi skapade i figur 7.
    Välj sedan FactSportsCarSales faktatabell.
  2. Klicka slutligen på OK .
E. Lägg till ett OLE DB-kommando för att uppdatera poster

Dra ett annat OLE DB-kommando och märk det Uppdatera poster. Anslut den sedan till CDC Splitter . Den kommer automatiskt att välja UpdateOutput produktion. Anslutningshanterare flikinställningen ska vara densamma som i figur 11.

Men Component PropertiesSQLCommand bör ha ett värde som detta:

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

Antalet frågetecken i koden ovan kommer att berätta hur många parametrar du ska använda från och med Param_0 .Placeringen av parametrar från Param_0 till Param_5 är ordnad baserat på deras plats i koden. Så, Param_0 isfor Klient-ID , Param_1 är för SportsCarID och så vidare.

Kolla in kolumnmappningar i figur 15.

Efter att ha konfigurerat CDC på databas- och tabellnivå, är sättet att testa om CDC fungerar genom att lägga till och ändra rader. Så låt oss lägga till några poster i tabellen.


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

För att se om detta är registrerat i CDC är det genom att fråga cdc.dbo_sportsCarSales_CT bord.

SELECT * FROM cdc.dbo_sportsCarSales_CT;

Kolla in resultaten i ändra datainsamling efter kommandot INSERT i figur 15.

Så den spelade in inläggen. Det är bra.

Testa nu att köra SSIS-paketet tidigare. Resultatet bör vara detsamma som i figur 16 nedan.

Figur 16 . SSIS-paketkörningsresultat för inkrementell laddning med CDC.

Och slutligen, fråga efter resultaten i FactSportsCarSales tabell visar samma uppsättning av 4 poster.

Inkrementell belastning i SSIS med DateTime-kolumner

Inkrementell belastning i SSIS med DateTime-kolumner är ett annat sätt att samla in data i steg. Om du råkar göra ETL i en tabell utan CDC, är detta ditt nästa alternativ.

Källtabellen kan ha en Ändrad eller Senaste uppdatering kolumn som den i figur 17.

Att fråga efter ändringarna är att veta det maximala Ändrade kolumnvärde från destinationen. Fråga sedan alla poster från källan som har större än Ändrad kolumnvärde från destinationen.

De typiska ingredienserna i denna teknik visas i figur 18.

Vänligen följ anvisningarna om hur man lagar denna typ av inkrementell belastning. Följande är underämnena för detta avsnitt:

  • Skapar paketet för att göra SSIS inkrementell laddning med DateTime-kolumner
  • Paketkörningsresultat

Skapa paketet för att göra SSIS inkrementell laddning med DateTime-kolumner

Vårt mål är att ladda Sportbilarna tabell i dimSportsCars dimensionstabell i en annan databas. Följande är en sammanfattning av stegen:

STEG 1. Skapa 2 OLE DB-anslutningshanterare
STEG 2. Skapa 2 paketvariabler
STEG 3. Lägg till en Execute SQL Task i kontrollflödet
STEG #4. Lägg till en Dataflödesuppgift

Låt oss börja.

STEG #1. Skapa 2 OLE DB Connection Managers

Den första OLE DB-anslutningen är från en transaktionsdatabas. Och inställningarna är enkla som visas i figur 19.

Skapa sedan en annan OLE DB-anslutning till datalagret. Detta bör vara detsamma som i figur 7.

STEG #2. Skapa 2 paketvariabler

Den första variabeln kommer att hålla det senast ändrade datumet från dimSportsCars dimensionstabell. Sedan kommer den andra att hålla den anpassade SQL-frågan.

A. Skapa User::sportsCars_lastUpdate-variabeln
  1. I Variabler klicka på Lägg till variabel .
  2. Ge det namnet sportsCars_lastupdate .
  3. Ställ in datatypen på DateTime .
B. Skapa User::sqlCommand-variabeln
  1. I Variabler klicka på Lägg till variabel .
  2. Ge det namnet sqlCommand .
  3. Ställ in typen på Sträng .
  4. Klicka på ellipsknappen för att skapa Uttrycket . Se figur 21 för Uttrycksbyggaren fönstret och det faktiska stränguttrycket.
  5. Klicka på OK .

SQL-strängen ska vara så här:

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

Lägg märke till att vi ställer in WHERE-satsen på Ändrad greaterthan User::sportsCars_lastupdate .

Det kommer att finnas mer information om att ställa in de två variablerna i de efterföljande stegen.

STEG #3. Lägg till en Execute SQL Task i kontrollflödet

Den här uppgiften kommer att fråga måltabellen för att få den senast Ändrade datumvärde. Dra en Kör SQL-uppgift till kontrollflödet. Märk det sedan Hämta senaste ändringsdatum från DW . Se sedan inställningarna i figur 21.

De viktiga egenskaperna att ställa in här är Anslutning , SQLStatement och Resultatuppsättning egenskaper.

Ställ in Anslutning egenskapen till den andra OLE DB-anslutningen i STEG #1. Ställ sedan in SQLStatement egendom till koden nedan.

select max(modified) as LastUpdate from dimSportsCars

Ställ sedan in Resultatuppsättningen egenskap till en enkel rad .

Slutligen måste du mappa Senaste uppdateringen kolumnalias (se koden ovan) till User::sportsCars_lastupdate variabel. Se en skärmdump i figur 22.

Klicka slutligen på OK för att spara de nya inställningarna.

STEG #4. Lägg till en dataflödesuppgift

Dra en Dataflödesuppgift till kontrollflödet och anslut Execute SQL Task till det. Märk sedan Dataflödesuppgiften Uppdatera dimensionen dimSportsCars . Följ sedan stegen för att lägga till komponenter till Dataflödesuppgiften .

Dataflödesuppgiften har flera steg inom sig:

A. Lägg till en OLE DB-källa
B. Lägg till en uppslagstransformation för att jämföra källan med destinationen
C. Lägg till ett OLE DB-kommando för att uppdatera poster
D. Lägg till en OLE DB-destination för att infoga poster

Nu börjar vi.

A. Lägg till en OLE DB-källa

Denna OLE DB-källa kommer att fråga källtabellen för de ändrade posterna. Se inställningarna i figur 23.

Efter siffrorna i figur 23, här är detaljerna:

  1. Först, specificera OLE DB-anslutningen vi skapade. Se figur 20.
  2. Ställ sedan in Dataåtkomstläge till SQL-kommandot från variabeln .
  3. Välj sedan variabeln User::sqlCommand som vi skapade tidigare. Se figur 21.
  4. Klicka slutligen på OK .
B. Lägg till en uppslagstransformation för att jämföra källan med destinationen

Nu måste vi ha ett sätt att jämföra käll- och destinationstabellerna. Vi kan använda Sök Transformationskomponent för att göra det. Detta kommer att utföra en koppling mellan de två tabellerna.

Så dra en uppslagning Transformation i dataflödet och namnge det Klassificera ändringen . Anslut den sedan till OLE DB-källan tidigare. Dubbelklicka på den. Se figur 24 för att ställa in Allmänt sida.

Ställ in rullgardinsmenyn till Omdirigera rader till ingen matchning som ses i figur 24. Det betyder att vi kommer att använda de rader som inte har någon matchning. Och i det här fallet är detta för att upptäcka rader som finns i källan men inte i destinationen.

Klicka sedan på Anslutning sida i den vänstra rutan i Lookup Transformation Editor . Se sedan figur 25 om vad du ska ställa in.

I figur 26 måste du ange OLE DB-anslutningen för måltabellen. (Se figur 7). Och ställ sedan in SQL-frågan till koden nedan.

SELECT SportsCarID from dimSportsCars

Vi behöver bara SportsCarID kolumn för att jämföra, så vi använde en fråga istället för hela tabellen.

Klicka sedan på Kolumner sida för att ställa in mappningen av nyckelkolumnen för källfrågan till destinationen. Se figur 26 för kartläggningen.

Som framgår av figur 26 bör det finnas en linje från källan till destinationen med SportsCarID nyckelkolumn. Båda nyckelkolumnerna kommer att användas för jämförelsen.

Klicka slutligen på OK .

C. Lägg till ett OLE DB-kommando för att uppdatera poster

Den här delen kommer att uppdatera de poster som har matchande SportsCarID nyckelvärden från Sök Förvandling.

Så dra ett OLE DB-kommando i dataflödet och döp det till Uppdatera dimSportsCars . Anslut den sedan till Sök Förvandling tidigare. När en uppmaning visas ställer du in Utdata till Lookup Match Output . Klicka sedan på OK .

Dubbelklicka på OLE DB-kommandot och ställ in egenskaperna i Anslutningshanterare flik. Se figur 27.

Figur 27 visar att du måste ställa in Anslutningshanteraren till måldatabasen (se figur 8). Klicka sedan på Komponentegenskaper flik. Se figur 28 för egenskapsinställningarna.

SQLCommand-egenskapen är inställd på:

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

Vi har redan gjort något liknande tidigare. Frågetecknen är parameterplatshållare. Och om vi mappar rätt källkolumn kommer motsvarande målkolumn att ställas in. Se mappningarna i figur 29.

Klicka slutligen på OK .

D. Lägg till en OLE DB-destination för att infoga poster

Den här delen kommer att infoga nya rekord som finns i Sportbilarna tabellen i dimSportsCars dimensionstabell.

Så dra en OLE DB-destination komponent och namnge den Infoga nya poster i dimSportsCars. Dubbelklicka på den och ställ in anslutnings- och måltabellen. Se figur 30.

Som visas i Figur 30, ställ in anslutningen till datalagret (Figur 8) och välj dimSportsCars dimensionstabell.

Klicka sedan på Mappningar sida för att se om kolumner är mappade därefter. Eftersom kolumnnamnen är samma i både källan och målet kommer de att mappas automatiskt.

Klicka slutligen på OK .

Resultat från paketkörning

Nu när paketet är klart, här är en skärmdump av resultatet i figur 31.

Processen uppdaterade 8 rader och infogade 1 ny rad i dimSportsCars dimensionstabell.

Inkrementell belastning i SSIS med hjälp av uppslag

En annan metod för att göra inkrementell laddning är att jämföra källan från målet för att se vad som behöver infogas, uppdateras och raderas. Och detta är ditt alternativ om det inte finns någon DateTime-kolumn och ingen CDCon båda tabellerna. Ett sätt att göra detta är att använda Sök Förvandling.

De typiska ingredienserna för detta tillvägagångssätt visas i figur 32.

Observera att det enkla tillvägagångssättet i figur 32 är tillämpligt för tabeller som inte tillåter hårda borttagningar. Om borttagningar behövs för att hanteras kan en sammanfogning med en fullständig sammanfogning vara tillämplig.

Det finns 2 underämnen för detta avsnitt:

Skapar SSIS-paketet för den inkrementella SSIS-belastningen med hjälp av Lookup
Paketkörningsresultat

Låt oss dyka in.

Skapa SSIS-paketet för den inkrementella SSIS-belastningen med hjälp av Lookup

Vårt mål här är att ladda raderna med tillverkare tabellen i dimManufacturers dimensionstabell.

Detta förutsätter att du har ett tomt SSIS-paket redo.

Följande är en sammanfattning av stegen:

STEG 1. Skapa 2 OLE DB-anslutningar
STEG 2. Lägg till en dataflödesuppgift

Låt oss börja med exemplet.

STEG #1. Skapa 2 OLE DB-anslutningar

Du kan se figur 19 för källan och figur 7 för målet. Vi använder samma anslutningshanterare här.

STEG #2. Lägg till en dataflödesuppgift

Dra en Dataflödesuppgift i kontrollflödet och döp det till Uppdatera tillverkarens dimensionstabell. Dubbelklicka på den och följ nästa steg. Nedan sammanfattas stegen i Dataflödesuppgiften .

A. Lägg till en OLE DB-källa
B. Lägg till en uppslagning Omvandling för att skanna efter nya poster
C. Lägg till en OLE DB-destination för att infoga poster.
D. Lägg till ytterligare en uppslagning Transformation till Sök efter ändringar
E. Lägg till ett OLE DB-kommando för att uppdatera måltabellen

A. Lägg till en OLE DB-källa

Dra en OLE DB-källa och märk det Tillverkare . Ställ in Anslutningshanteraren som ses i figur 33.

B. Lägg till en uppslagstransformation för att söka efter nya poster

Denna uppslagning Transformation kommer att söka efter poster som inte finns i målet baserat på Manufacturer ID nyckelkolumn. Och alla icke-matchande rader är kandidater för tabellinfogning.

Dra en uppslagning transformationand name it Lookup dimManufacturers. Dubbelklicka sedan på den.

Inställningarna för Allmänt sidan ska vara densamma som i figur 24. Ställ under tiden in anslutningen till datalagret och använd en fråga för Anslutningar sidinställningar. Se figur 34.

C. Lägg till en OLE DB-destination för att infoga poster

Dra en OLE DB-destination och döp det till Infoga nya poster. Anslut den till Sök Transformation och välj Sök ingen matchning när en prompt visas. Dubbelklicka på den och ställ in anslutnings- och måltabellen som visas i figur 35.

Käll- och måltabellerna har samma kolumnnamn och de mappas automatiskt. Se figur 36.

Klicka slutligen på OK .

D. Lägg till ytterligare en uppslagstransformation för att söka efter ändringar

Till skillnad från den tidigare uppslagningen Transformation, den här kommer att söka efter ändringar i Tillverkaren kolumn. Och om det finns ändringar kommer det att vara en kandidat för tabelluppdatering.

Dra en annan uppslagning Transformation och namnge den Sökposter som har ändrats. Anslut den till den första uppslagningen Omvandling. Generalen sidan för denna uppslagning bör vara densamma som i figur 24.

Under tiden, Anslutning sidan ska se ut som i figur 37 nedan.

Under tiden, lägg märke till mappningarna i figur 38.

Figur 38 visar mappningar genom Tillverkare namn. Om det inte är lika, finns det en förändring i källan. Och det måste kopieras i målet.

E. Lägg till ett OLE DB-kommando för att uppdatera måltabellen

Inställningarna bör vara desamma som i figur 29, förutom SQLCommand . Kommandot UPDATE bör vara så här:

UPDATE dimManufacturers
set manufacturer = ?
where manufacturerID = ?

Justera kolumnmappningarna till parametrarna i enlighet med detta.

Resultat från paketkörning

Gjort? Kör sedan paketet. Du kommer att se körtidsresultat på samma sätt som i figur 39.

Det bästa verktyget för SSIS-dataladdning

Alla exempel vi hade tidigare använder de out-of-the-box-komponenter som kommer från Microsoft. Även om det är tillräckligt bra för vissa projekt, tänk om du måste integrera både moln- och databaskällor via SSIS?

Det är här Devart SSIS-komponenter kommer in i bilden. Dessa SSIS-komponenter är bekväma att använda. Och de erbjuder högpresterande dataladdning med datakällaspecifika optimeringar och avancerad cachelagring. De har också 40+ datakällor, inklusive RDBMS-favoriter som MySQL, PostgreSQL och Oracle. Dessutom ingår molntjänster som Salesforce, HubSpot, Google Analytics och mycket mer. Så det är värt ett försök att ladda miljontals poster i SSIS med Devart SSIS-komponenter.

Varför inte ett exempel?

Använda Devart SSIS-komponenter för att göra inkrementell belastning

Låt oss försöka replikera dimManufacturers tabell i MySQL och använd Devarts Lookup och Destination komponenter för MySQL. Receptet visas i figur 40.

Låt oss börja med att lägga till ett nytt SSIS-paket till ditt Visual Studio Integration Services-projekt. Lägg sedan till en Data Flow Task och dubbelklicka på den. Följ sedan stegen nedan.

Innan dess, här är en sammanfattning av stegen:

STEG 1. Lägg till en OLE DB-källa
STEG 2. Lägg till en Devart MySQL Connection Manager
STEG 3. Lägg till en Devart MySQL Lookup för att söka efter nya poster
STEG #4. Lägg till ytterligare en Devart MySQL Lookup Transformation för att skanna efter ändringar
STEG #5. Lägg till en Devart MySQL-destination för att infoga poster
STEG #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 earlier. 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 table.
  3. In Lookup Columns , mark checked the ManufacturerID kolumn.
  4. Then, in Input Columns , select ManufacturerID .
  5. Then, select ManufacturerID in Reference Columns .
  6. Finally, click OK .

OBS :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.

Slutsats

Det är det.

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.


  1. Dela upp strängen i flera rader i Oracle

  2. Sammanföra två tabeller med olika antal kolumner

  3. Komplex Postgres-fråga

  4. PostgreSQL-funktion för senast infogade ID