sql >> Database teknologi >  >> RDS >> Database

Inkrementel belastning i SSIS

Folk har stadig mere travlt. De vil have deres data næsten lige nu. Og endnu mere, data bliver større og større. Så du kan ikke bruge gode gamle teknikker, fordi de er "gode nok". Det skal være hurtigt. Og ETL-trin er ikke en undtagelse. Det er her den trinvise belastning kommer til at spille. Og hvis du er på denne side, leder du sandsynligvis efter trinvis belastning i SSIS.

Og det er vores fokus i denne artikel. Vi vil lave sammenligninger og eksempler for at forklare den trinvise databelastning i SSIS trin for trin. Og vær sikker på, at det ikke knækker dit hoved, når du finder ud af dette.

Her er hvad der venter dig:

  • Hvad er fuld belastning og trinvis belastning i ETL?
  • Hvad er trinvis dataindlæsning i SSIS?
  • Forskellene mellem fuld belastning og trinvis belastning i SSIS
  • Inkrementel belastning i SSIS ved hjælp af CDC eller Change Data Capture
  • Inkrementel belastning i SSIS ved hjælp af DateTime-kolonner
  • Sådan udfører du trinvis belastning i SSIS ved hjælp af opslag
  • Det bedste værktøj til indlæsning af SSIS-data

Hvert afsnit vil have underafsnit. Du kan hoppe til det emne, du har brug for, ved at klikke på linkene.

Før vi begynder med eksemplerne, lad os sammenligne trinvis belastning med dens modsætning, den fulde belastning.

Hvad er fuld belastning og inkrementel belastning i ETL

Uanset hvilke ETL-værktøjer du bruger, har Fuld og Inkrementel belastning den samme betydning. Lad os beskrive dem nedenfor.

Fuld belastning i ETL

Som navnet antyder, indlæser Full Load i ETL ALLE data fra kilden til destinationen. En måltabel afkortes, før alt indlæses fra kilden. Derfor er denne teknik også kendt som Destruktiv belastning . Denne teknik er også lettere at udføre. Og dette sikrer også den højeste dataintegritet. Men størrelsen på dine data i dag er større end i går. Så hvis du bruger dette på stadigt voksende data, vil processen blive langsommere over tid.

ETL fuld belastningsbrug

  • Størrelsen af ​​kildedataene er lille og vil ikke vokse væsentligt i mange år fremover. Eksempler inkluderer en liste over farver, nogle få kategorier/klassifikationer, liste over lande og byer og mange flere.
  • Det er svært at sige, hvad der er nyt eller ændret i kilden.
  • Data skal være nøjagtig ens fra kilden til destinationen
  • Historien for dataene er irrelevant og overskrives oftere

Inkrementel belastning i ETL

I mellemtiden er Incremental Load også som navnet antyder. Kun de data, der er ændret, vil blive indlæst fra kilden til destinationen. Dette gøres trinvist over tid. Dem, der ikke ændrede sig, forbliver som de er. Dette er lidt svært at gøre. Du skal sikre dig, at alle ændringerne er blevet samlet og indlæst til destinationen. Men dette vil køre hurtigere end fuld belastning på meget store data.

ETL Incremental Load Use Cases

  • Datastørrelsen er meget stor, og forespørgslen vil være meget langsom for store resultatsæt
  • Ændringer er nemme at forespørge på
  • Slettede data skal bevares på destinationen, ligesom et revisionssystem

Hvad er inkrementel belastning i SSIS

De grundlæggende bestanddele af en inkrementel belastning i SSIS er vist i figur 1.

Inkrementel belastning i SSIS har en tendens til at være mere kompleks afhængigt af dine krav. Men det enkle "opskriftskort" i figur 1 inkluderer, hvad du skal bruge for at "tilberede" data i trin. At fange ændringer i dataene er den udfordrende del. Du kan ødelægge destinationen, hvis du ikke er forsigtig.

I de efterfølgende sektioner vil du se, hvordan du udfører trinvis belastning i SSIS med eksempler. Disse omfatter brug af ChangeData Capture (CDC), DateTime-kolonner og opslag. Du vil også se, hvordan dette gøres ved hjælp af Devart SSIS-komponenter.

Lad os sammenligne trinvis belastning med fuld belastning i SSIS i næste afsnit.

Forskellen mellem fuld belastning og trinvis belastning i SSIS

Du har allerede set, hvordan inkrementel belastning ser ud i SSIS (figur 1). I mellemtiden, her er, hvordan det går med SSIS Full load i figur 2 nedenfor.

Forskellen mellem fuld belastning og inkrementel belastning i SSIS er i pakkedesignet. Et design med fuld belastning kræver, at færre komponenter trækkes ind i SSIS-pakken. Det er så enkelt, at der er lidt tænkning involveret. Det er derfor, på grund af en falsk følelse af produktivitet, har nogle udviklere en tendens til at ty til denne teknik det meste af tiden.

Men at køre en designpakke med fuld belastning hver nat er ikke tilrådeligt for store data, f.eks. 15 TB. Tror du, det vil blive færdigt til tiden, før brugerne ankommer om morgenen? Det vil ikke ske, fordi du forsøger at genindsætte de poster, der slet ikke ændrede sig. Hvis det er omkring 70 % af dataene, har du brug for mere nedetid afhængigt af serverressourcer.

Det er uacceptabelt.

Så jo mere skal du bruge inkrementel belastning på disse scenarier. I de følgende afsnit lærer du, hvordan du indlæser data hurtigere ved hjælp af trinvis belastning.

Inkrementel belastning inSSIS ved hjælp af CDC

Lad os først overveje at bruge Change Data Capture (CDC). Bemærk, at fra her til de næste 3 eksempler, vil vi bruge simple eksempler. Så pakkedesignet vil ikke sløre målet.

Før vi begynder med eksemplet, vil dette afsnit dække følgende:

  • For det første, hvordan man aktiverer CDC i en database og tabel
  • Så skal du oprette SSIS-pakken til SSIS inkrementel belastning ved hjælp af CDC
  • Til sidst, kør og kontroller resultaterne

Figur 3 viser bestanddelene i dette eksempel.

Change Data Capture (CDC) registrerer indsættelser, sletninger og opdateringer i en tabel. Før du kan få dette eksempel til at fungere, skal du bruge en database og en tabel, der er konfigureret til CDC.

Sådan aktiverer du CDC i en database og tabel

Database- og tabelindstillinger er som standard uden CDC. For at gøre en database CDC-aktiveret, her er T-SQL-syntaksen:

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

Kør derefter denne for at kontrollere, om CDC virkelig er aktiveret:

select name from sys.databases
where is_cdc_enabled=1

Hvis navnet på den database, du aktiverede for CDC, vises, er du klar. Din database er nu CDC-aktiveret.

Men det slutter ikke her. Du skal angive, hvilken tabel du vil spore for eventuelle ændringer. sp_cdc_enable_table vil gøre tricket. Nedenfor er et eksempel på det.

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

Kørsel af ovenstående kode bør resultere i lignende meddelelser nedenfor:

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

Disse meddelelser er de 2 nye SQL Server Agent-job, der er oprettet efter aktivering af en tabel for CDC. Det er derfor, du har brug for SQL Server Agent for at få CDC til at fungere. Se et skærmbillede i figur 4.

Udfører indsættelser, sletninger og opdateringer på sportsCarSales tabel vil automatisk registrere ændringerne til en anden tabel ved navn cdc.dbo_sportsCarSales_CT . Denne tabel har kolonner som originalen. Se et skærmbillede i figur 5.

_$operationen kolonne i venstre tabel er af særlig interesse. Mulige værdier for denne kolonne er 1 (Slet), 2 (Indsæt), 3 og 4 (Opdater). Opdatering bruger 2 værdier:en for kolonneværdier før opdateringen (det er 3). Og den anden for kolonneværdier efter opdateringen (det er 4). Du kan kontrollere denne kolonne, når du tjekker værdierne, før du kører din SSIS-pakke. CDCSource og CDC Splitter komponenter bruger denne tabel, når de identificerer ændringer. Mere om disse i næste afsnit.

Oprettelse af SSIS-pakken til SSIS inkrementel belastning ved hjælp af CDC

Her er trinene til at oprette SSIS-pakken med trinvis belastning ved hjælp af CDC. Dette forudsætter, at du allerede har en blankpakke i Visual Studio 2019. Vores mål her er at indlæse rækkerne fra sportsCarSales ind i FactSportsCarSales faktatabel i et datavarehus.

Følgende er en oversigt over trin:

TRIN 1. Opret 2 databaseforbindelsesadministratorer
TRIN #2. Træk 2 CDC Control Task til kontrolflowet
TRIN #3. Træk en dataflowopgave og opret forbindelse til CDC-kontrolopgaven

TRIN #1. Opret 2 databaseforbindelsesadministratorer

Vi har brug for 2 databaseforbindelser her. Den ene er ADO.Net-forbindelsen, der skal pege på den CDC-aktiverede database. Og opret derefter en OLE DB-forbindelse til et datavarehus som destination. Begge er SQL Server 2019-databaser. Se figur 6 og 7 tilsvarende. I dette eksempel er begge databaser på den samme maskine. Og vi bruger Windows-godkendelse til at oprette forbindelse.

Så i Forbindelsesadministratorer vindue, højreklik og vælg Ny ADO.Net-forbindelse . Udfyld derefter server-, godkendelses- og databaseindstillingerne som vist i figur 6 nedenfor.

Opret derefter en OLE DB-forbindelse til datavarehuset. I vinduet Connections Manager skal du højreklikke og vælge Ny OLE DB-forbindelse . Udfyld derefter serveren, godkendelsen og databasenavnet. Angiv datavarehuset her.

TRIN #2. Træk 2 CDC-kontrolopgaver til kontrolflowet

Der er 2 ting, vi skal gøre efter at have trukket en CDC-kontrolopgave i kontrolflowet.

Marker CDC Start

Først skal vi konfigurere CDC-kontrolopgaven til at markere CDC Start. Og opret derefter en CDC State-tabel. Dette kan gøres i ét konfigurationsvindue. Se figur 8 nedenfor.

Følgende de nummererede trin i figur 9 er de følgende detaljer.

  1. Vælg den ADO.Net-forbindelse, vi oprettede i figur 6.
  2. Vælg derefter Markér CDC-start .
  3. Klik på Ny at oprette en CDC-tilstandsvariabel. Derefter vises et vindue. Klik på OK for at oprette standardvariabelnavnet Bruger::CDC_State .
  4. Vælg ADO.Net-forbindelsen, så vi kan gemme CDC-tilstanden i den database.
  5. Klik på Ny at oprette en tabel til lagring af tilstand. Scriptet er allerede oprettet til dig. Så klik bare på Kør i det næste vindue.
  6. Vælg derefter CDC_State som statens navn.
  7. Klik til sidst på OK .

Efter at have konfigureret denne CDC-kontrolopgave, kør pakken. Du vil endnu ikke se poster kopieret til den anden database. Men tilstandstabellen (dbo.cdc_state ) vil blive udfyldt med startværdier.

Herfra kan du vælge at deaktivere denne CDC-kontrolopgave eller overskrive den igen med nye værdier i den næste opgave.

Hent behandlingsområde

Enten trækker du en ny CDC-kontrolopgave til kontrolflowet eller overskriver den forrige. Konfigurationen er den samme som i figur 9, bortset fra CDC Control Operation (#2). Denne gang skal du vælge Hent behandlingsområde . Klik derefter på OK . Forbind dette til Dataflow-opgaven i TRIN #3 senere.

Marker behandlet område

Konfigurer den anden CDC-kontrolopgave som den første, bortset fra denne gang, vælg Markér behandlet område for CDC-kontroloperationen. Forbind Dataflow-opgaven i TRIN #3 til denne.

Trin #3. Træk en dataflow-opgave og opret forbindelse til CDCControl-opgaven

Denne dataflowopgave udfører udtrækningen og indlæsningen som vist i figur 3 tidligere. Før vi dykker ned i detaljerne for hvert trin, er her en oversigt:

A. Tilføj en CDC-kilde
B. Tilføj en CDC-splitter og tilslut den til CDC-kilden
C. Tilføj en OLE DB-kommando for at slette poster
D. Tilføj en OLE DB-destination for at indsætte poster
E. Tilføj endnu en OLE DB-kommando for at opdatere poster

Lad os nu dykke ind.

A. Tilføj en CDC-kilde

Træk en CDC-kilde komponent med indstillinger vist i figur 9 nedenfor.

Efter de nummererede trin i figur 9 er følgende detaljer:

  1. Vælg først den ADO.Net-forbindelse, vi oprettede i figur 6.
  2. Vælg derefter den CDC-aktiverede tabel sportsCarSales .
  3. Vælg opsamlingsforekomsten dbo_SportsCarSales .
  4. Vælg derefter Net til CDC-behandlingstilstand. Dette vil kun returnere nettoændringer. For en detaljeret beskrivelse af hver behandlingstilstand, tjek dette link. Du kan også klikke på Forhåndsvisning for at se, hvilke rækker der vil blive inkluderet.
  5. Vælg CDC State-variablen, vi oprettede tidligere (figur 9).
  6. Klik til sidst på OK .
B. Tilføj en CDC-splitter og tilslut den til CDC-kilden

Det eneste krav til en CDC Splitter er en CDC-kilde forud for det. Så tilslut CDC-kilden tidligere til denne komponent. Dette adskiller ændringerne til indsættelser, opdateringer og sletninger.

C. Tilføj en OLE DB-kommando for at slette poster

Først skal du mærke denne komponent som Slet poster (se figur 3). Tilslut derefter denne til CDC-splitteren. Når en prompt vises, skal du vælge Slet output for output, og klik på OK .

Konfigurer derefter OLE DB-kommandoen Forbindelsesadministratorer fanen. Se figur 10.

Dernæst i Komponentegenskaber fanen, skal du angive kommandoen DELETE for SQLCommand ejendom. Kommandoen skal være sådan her:

DELETE FROM FactSportsCarSales
WHERE SalesID = ?

Se et skærmbillede i figur 11 nedenfor.

Spørgsmålstegnet vil oprette en parameter for Salgs-ID . Hvert SalgID værdi, der kommer fra CDCSplitter vil blive brugt til at slette rækker i FactSportsCarSales tabel.

Derefter i Kolonnetilknytninger fanen, skal du kortlægge Salg-ID kolonne i tabellen til parameteren (Param_0 ) Se figur 12.

Klik til sidst på OK.

D. Tilføj en OLE DB-destination for at indsætte poster

Træk først en OLE DB-destination . Derefter skal du mærke det Indsæt poster . Tilslut denne til CDC-splitteren . Vælg derefter InsertOutput når en vinduesprompt vises. Se figur 14 for de grundlæggende indstillinger.

Følg de nummererede trin i figur 13, nedenfor er detaljerne:

  1. Først skal du vælge den OLE DB-forbindelse, vi oprettede i figur 7.
    Vælg derefter FactSportsCarSales faktatabel.
  2. Klik til sidst på OK .
E. Tilføj en OLE DB-kommando for at opdatere poster

Træk en anden OLE DB-kommando og mærke det Opdater poster. Tilslut den derefter til CDC-splitteren . Den vil automatisk vælge OpdaterOutput produktion. Forbindelsesadministratorerne faneindstillingen skal være den samme som i figur 11.

Men Component PropertiesSQLCommand skal have en værdi som denne:

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

Antallet af spørgsmålstegn i koden ovenfor vil fortælle dig, hvor mange parametre du skal bruge fra Param_0 .Placeringen af ​​parametre fra Param_0 til Param_5 er arrangeret baseret på deres plads i koden. Så Param_0 isfor ClientID , Param_1 er til SportsCarID ,og så videre.

Tjek Kolonnetilknytninger i figur 15.

Efter at have konfigureret CDC på database- og tabelniveau, kan man teste, om CDC virker, ved at tilføje og ændre rækker. Så lad os tilføje nogle poster til 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

For at se, om dette er optaget i CDC, er det ved at forespørge på cdc.dbo_sportsCarSales_CT tabel.

SELECT * FROM cdc.dbo_sportsCarSales_CT;

Se resultaterne i ændring af datafangst efter kommandoen INSERT i figur 15.

Så den optog indsættelserne. Det er godt.

Prøv nu at køre SSIS-pakken tidligere. Resultatet skal være det samme som i figur 16 nedenfor.

Figur 16 . SSIS-pakkekørselsresultat for trinvis belastning ved hjælp af CDC.

Og endelig forespørge resultaterne i FactSportsCarSales tabel afslører det samme sæt af 4 poster.

Inkrementel belastning i SSIS ved hjælp af DateTime-kolonner

Inkrementel belastning i SSIS ved hjælp af DateTimecolumns er en anden måde at indsamle data i trin. Hvis du tilfældigvis laver ETL i en tabel uden CDC, er dette din næste mulighed.

Kildetabellen kan have en Ændret eller Sidste opdatering kolonne som den i figur 17.

At forespørge på ændringerne er at kende det maksimale Ændrede kolonneværdi fra destinationen. Forespørg derefter alle poster fra kilden, der har større end Modified kolonneværdi fra destinationen.

De typiske ingredienser i denne teknik er vist i figur 18.

Følg venligst instruktionerne om, hvordan man tilbereder denne type trinvis belastning. Følgende er underemnerne for dette afsnit:

  • Oprettelse af pakken for at udføre SSIS trinvis indlæsning med DateTime-kolonner
  • Pakkekørselsresultater

Oprettelse af pakken til at udføre SSIS inkrementel belastning med DateTime-kolonner

Vores mål er at indlæse SportsCars tabel i dimSportsCars dimensionstabel i en anden database. Følgende er en oversigt over trinene:

TRIN 1. Opret 2 OLE DB-forbindelsesadministratorer
TRIN #2. Opret 2 pakkevariabler
TRIN #3. Tilføj en Udfør SQL-opgave i kontrolflowet
TRIN #4. Tilføj en Dataflow-opgave

Lad os begynde.

TRIN #1. Opret 2 OLE DB-forbindelsesadministratorer

Den første OLE DB-forbindelse er fra en transaktionsdatabase. Og indstillingerne er enkle som vist i figur 19.

Opret derefter en anden OLE DB-forbindelse til datavarehuset. Dette bør være det samme som i figur 7.

TRIN #2. Opret 2 pakkevariabler

Den første variabel vil holde den sidste ændrede dato fra dimSportsCars dimensionstabel. Derefter vil den anden indeholde den tilpassede SQL-forespørgsel.

A. Opret User::sportsCars_lastUpdate Variable
  1. I Variabler vindue, skal du klikke på Tilføj variabel .
  2. Navngiv den sportsCars_lastupdate .
  3. Indstil datatypen til DatoTid .
B. Opret User::sqlCommand Variable
  1. I Variabler vindue, skal du klikke på Tilføj variabel .
  2. Navngiv den sqlCommand .
  3. Indstil typen til String .
  4. Klik på ellipseknappen for at oprette udtrykket . Se figur 21 for Expression Builder vinduet og det faktiske strengudtryk.
  5. Klik på OK .

SQL-strengen skal være sådan her:

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

Bemærk, at vi indstiller WHERE-sætningen til Modified greaterthan Bruger::sportsCars_lastupdate .

Der vil være flere detaljer om indstilling af de 2 variable i de efterfølgende trin.

TRIN #3. Tilføj en Execute SQL-opgave i kontrolflowet

Denne opgave vil forespørge destinationstabellen for at få den sidste ændret dato værdi. Træk en Udfør SQL-opgave til kontrolflowet. Derefter skal du mærke det Hent sidst ændrede dato fra DW . Se derefter indstillingerne i figur 21.

De vigtige egenskaber, der skal angives her, er Forbindelsen , SQLStatement og Resultatsæt egenskaber.

Indstil Forbindelse egenskab til det andet OLE DB-forbindelsessæt i TRIN #1. Indstil derefter SQLStatement ejendom til koden nedenfor.

select max(modified) as LastUpdate from dimSportsCars

Indstil derefter Resultatsæt ejendom til en enkelt række .

Til sidst skal du kortlægge LastUpdate kolonnealias (se koden ovenfor) til User::sportsCars_lastupdate variabel. Se et skærmbillede i figur 22.

Klik til sidst på OK for at gemme de nye indstillinger.

TRIN #4. Tilføj en dataflowopgave

Træk en Dataflow-opgave til kontrolflowet og tilslut Udfør SQL-opgaven til det. Mærk derefter Dataflow-opgaven Opdater dimensionen dimSportsCars . Følg derefter trinene for at tilføje komponenter til Dataflow-opgaven .

Dataflow-opgaven har flere trin i sig:

A. Tilføj en OLE DB-kilde
B. Tilføj en opslagstransformation for at sammenligne kilden med destinationen
C. Tilføj en OLE DB-kommando for at opdatere poster
D. Tilføj en OLE DB-destination for at indsætte poster

Lad os nu begynde.

A. Tilføj en OLE DB-kilde

Denne OLE DB-kilde vil forespørge i kildetabellen for de ændrede poster. Se indstillingerne i figur 23.

Efter tallene i figur 23, her er detaljerne:

  1. Først skal du angive den OLE DB-forbindelse, vi oprettede. Se figur 20.
  2. Indstil derefter Dataadgangstilstand til SQL-kommando fra variablen .
  3. Vælg derefter variablen User::sqlCommand, som vi oprettede tidligere. Se figur 21.
  4. Klik til sidst på OK .
B. Tilføj en opslagstransformation for at sammenligne kilden med destinationen

Nu skal vi have en måde at sammenligne kilde- og destinationstabellerne på. Vi kan bruge Opslag Transformationskomponent til at gøre det. Dette vil udføre en join mellem de 2 borde.

Så træk et opslag Transformation i dataflowet, og navngiv det Klassificer ændringen . Tilslut den derefter til OLE DB-kilden tidligere. Dobbeltklik på det. Se figur 24 for opsætning af Generelt side.

Indstil rullemenuen til Omdiriger rækker til output uden match som det ses i figur 24. Det betyder, at vi kommer til at bruge de rækker, der ikke har nogen match. Og i dette tilfælde er dette til at detektere rækker, der er til stede i kilden, men ikke i destinationen.

Klik derefter på Forbindelse side i venstre rude i Opslagstransformationseditoren . Se derefter figur 25 om, hvad du skal indstille.

I figur 26 skal du angive OLE DB-forbindelsen for måltabellen. (Se figur 7). Indstil derefter SQL-forespørgslen til koden nedenfor.

SELECT SportsCarID from dimSportsCars

Vi har kun brug for SportsCarID kolonne for at sammenligne, så vi brugte en forespørgsel i stedet for hele tabellen.

Klik derefter på Kolonner side for at indstille tilknytningen af ​​kildeforespørgselsnøglekolonnen til destinationen. Se figur 26 for kortlægningen.

Som det ses i figur 26, skal der være en linje fra kilden til destinationen ved hjælp af SportsCarID nøgle kolonne. Begge nøglekolonner vil blive brugt til sammenligningen.

Klik til sidst på OK .

C. Tilføj en OLE DB-kommando for at opdatere poster

Denne del vil opdatere de poster, der har matchende SportsCarID nøgleværdier fra Opslag Transformation.

Så træk en OLE DB-kommando i Dataflowet, og navngiv det Opdater dimSportsCars . Tilslut den derefter til Opslag Forvandling tidligere. Når en prompt vises, skal du indstille Output til Opslagsmatch-output . Klik derefter på OK .

Dobbeltklik på OLE DB-kommandoen og indstil egenskaberne i Forbindelsesadministratorer fanen. Se figur 27.

Figur 27 viser, at du skal indstille Connection Manager til måldatabasen (se figur 8). Klik derefter på Komponentegenskaber fanen. Se figur 28 for egenskabsindstillingerne.

SQLCommand-egenskaben er indstillet til:

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

Vi har allerede gjort noget lignende tidligere. Spørgsmålstegnet er parameterpladsholdere. Og hvis vi kortlægger den korrekte kildekolonne, vil den tilsvarende målkolonne blive sat. Se kortlægningerne i figur 29.

Klik til sidst på OK .

D. Tilføj en OLE DB-destination for at indsætte poster

Denne del vil indsætte nye rekorder fundet i SportsCars tabellen i dimSportsCars dimensionsskema.

Så træk en OLE DB-destination komponent og navngiv den Indsæt nye rekorder i dimSportsCars. Dobbeltklik på den, og indstil forbindelses- og måltabellen. Se figur 30.

Som vist i figur 30 skal du indstille forbindelsen til datavarehuset (figur 8) og vælge dimSportsCars dimensionstabel.

Klik derefter på Mappings side for at se, om kolonner er kortlagt i overensstemmelse hermed. Da kolonnenavne er de samme i både kilden og målet, vil de blive kortlagt automatisk.

Klik til sidst på OK .

Resultater af pakkekørsel

Nu hvor pakken er færdig, er her et skærmbillede af resultatet i figur 31.

Processen opdaterede 8 rækker og indsatte 1 ny række til dimSportsCars dimensionstabel.

Inkrementel belastning i SSIS ved hjælp af opslag

En anden metode til at udføre trinvis belastning er at sammenligne kilden fra målet for at se, hvad der skal indsættes, opdateres og slettes. Og dette er din mulighed, hvis der ikke er nogen DateTime-kolonne og ingen CDCon begge tabeller. En måde at gøre dette på er at bruge Opslag Transformation.

De typiske ingredienser til denne fremgangsmåde er vist i figur 32.

Bemærk, at den simple tilgang i figur 32 er anvendelig for tabeller, der ikke tillader hårde sletninger. Hvis sletninger er nødvendige for at blive håndteret, kan en Merge Join ved hjælp af en fuld join være relevant.

Der er 2 underemner til dette afsnit:

Oprettelse af SSIS-pakken til den trinvise SSIS-belastning ved hjælp af opslag
Pakkekørselsresultater

Lad os dykke ned.

Oprettelse af SSIS-pakken til den trinvise SSIS-belastning ved hjælp af opslag

Vores mål her er at indlæse rækkerne af producenter tabellen i dimManufacturers dimensionsskema.

Dette forudsætter, at du har en tom SSIS-pakke klar.

Følgende er en oversigt over trin:

TRIN 1. Opret 2 OLE DB-forbindelser
TRIN #2. Tilføj en dataflowopgave

Lad os begynde med eksemplet.

TRIN #1. Opret 2 OLE DB-forbindelser

Du kan henvise til figur 19 for kilden og figur 7 for målet. Vi bruger de samme forbindelsesadministratorer her.

TRIN #2. Tilføj en dataflowopgave

Træk en Dataflow-opgave i kontrolflowet, og navngiv det Opdater producentens dimensionstabel. Dobbeltklik på det, og følg de næste trin. Opsummeret nedenfor er trinene i Dataflow-opgaven .

A. Tilføj en OLE DB-kilde
B. Tilføj et opslag Transformation til at scanne efter nye poster
C. Tilføj en OLE DB-destination at indsætte poster.
D. Tilføj endnu et opslag Transformation til Scan for Changes
E. Tilføj en OLE DB-kommando for at opdatere måltabellen

A. Tilføj en OLE DB-kilde

Træk en OLE DB-kilde og mærke det Producenter . Indstil Forbindelseshåndtering som det ses i figur 33.

B. Tilføj en opslagstransformation for at scanne efter nye poster

Dette opslag Transformation vil scanne for poster, der ikke findes i målet baseret på Producent-ID nøglekolonne. Og alle ikke-matchende rækker er kandidater til tabelindsættelse.

Træk et opslag transformationand name it Lookup dimManufacturers. Dobbeltklik derefter på det.

Indstillingerne for Generelt siden skal være den samme som i figur 24. Indstil i mellemtiden forbindelsen til datavarehuset og brug en forespørgsel til Forbindelser sideindstillinger. Se figur 34.

C. Tilføj en OLE DB-destination for at indsætte poster

Træk en OLE DB-destination og navngiv den Indsæt nye poster. Tilslut den til Opslag Transformation, og vælg Opslag uden match-output når en prompt vises. Dobbeltklik på den, og indstil forbindelses- og måltabellen som vist i figur 35.

Kilde- og måltabellerne har de samme kolonnenavne, og de kortlægges automatisk. Se figur 36.

Klik til sidst på OK .

D. Tilføj endnu en opslagstransformation for at scanne for ændringer

I modsætning til det tidligere Opslag Transformation, denne vil scanne for ændringer i Producent kolonne. Og hvis der er ændringer, vil det være en kandidat til tabelopdatering.

Træk endnu et opslag Transformation og navngiv den Opslagsposter, der er ændret. Tilslut den til det første opslag Transformation. Generalen side for dette opslag skal være den samme som i figur 24.

I mellemtiden er Forbindelsen siden skal se ud som figur 37 nedenfor.

Læg i mellemtiden mærke til kortlægningerne i figur 38.

Figur 38 viser kortlægninger gennem Producent navn. Hvis det ikke er ens, er der en ændring i kilden. Og det skal kopieres i målet.

E. Tilføj en OLE DB-kommando for at opdatere måltabellen

Indstillingerne skal være de samme som i figur 29, bortset fra SQLCommand . UPDATE-kommandoen skal være sådan her:

UPDATE dimManufacturers
set manufacturer = ?
where manufacturerID = ?

Juster kolonnetilknytningerne til parametrene i overensstemmelse hermed.

Resultater af pakkekørsel

Færdig? Kør derefter pakken. Du vil se runtime-resultater på samme måde som i figur 39.

Det bedste værktøj til SSIS-dataindlæsning

Alle eksempler, vi havde tidligere, bruger de out-of-the-box-komponenter, der kommer fra Microsoft. Selvom det er godt nok til nogle projekter, hvad nu hvis du skal integrere både cloud- og databasekilder via SSIS?

Det er her Devart SSIS-komponenter kommer i spil. Disse SSIS-komponenter er praktiske at bruge. Og de tilbyder højtydende dataindlæsning ved hjælp af datakildespecifikke optimeringer og avanceret caching. De har også 40+ datakilder, inklusive RDBMS-favoritter som MySQL, PostgreSQL og Oracle. Skytjenester som Salesforce, HubSpot, Google Analytics og meget mere er også inkluderet. Så det er værd at prøve at indlæse millioner af poster i SSIS ved hjælp af Devart SSIS-komponenter.

Hvorfor ikke et eksempel?

Brug af Devart SSIS-komponenter til at udføre trinvis belastning

Lad os prøve at kopiere dimManufacturers tabel ind i MySQL, og brug Devarts Opslag og Destination komponenter til MySQL. Opskriften er vist i figur 40.

Lad os begynde med at tilføje en ny SSIS-pakke til dit Visual Studio Integration Services-projekt. Tilføj derefter en Data FlowTask og dobbeltklik på den. Følg derefter nedenstående trin.

Før det er her en oversigt over trinene:

TRIN 1. Tilføj en OLE DB-kilde
TRIN #2. Tilføj en Devart MySQL Connection Manager
TRIN #3. Tilføj et Devart MySQL-opslag for at scanne efter nye poster
TRIN #4. Tilføj endnu et Devart MySQL-opslag Transformation for at scanne for ændringer
TRIN #5. Tilføj en Devart MySQL-destination at indsætte poster
TRIN #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 tabel.
  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 .

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

Konklusion

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.


  1. java.lang.IllegalArgumentException:kolonne '_id' findes ikke

  2. SQL:IF-sætning i WHERE-sætning

  3. Overvågning af dine databaser med MySQL Enterprise Monitor

  4. Lagret procedure for at få indeksstatus i alle databaser