sql >> Database >  >> RDS >> Database

Incrementeel laden in SSIS

Mensen hebben steeds meer haast. Ze willen hun gegevens bijna nu. En meer nog, data wordt steeds groter. Je kunt dus geen goede oude technieken gebruiken omdat ze "goed genoeg" zijn. Het moet snel zijn. En ETL-stappen zijn geen uitzondering. Dit is waar incrementele belasting om de hoek komt kijken. En als je op deze pagina bent, ben je waarschijnlijk op zoek naar incrementele belasting in SSIS.

En dat is onze focus in dit artikel. We gaan vergelijkingen en voorbeelden maken om stap voor stap incrementele gegevensbelasting in SSIS uit te leggen. En wees gerust, het zal je hoofd niet breken als je dit uitzoekt.

Dit staat je te wachten:

  • Wat zijn volledige en incrementele belasting in ETL?
  • Wat is incrementeel laden van gegevens in SSIS?
  • De verschillen tussen volledige belasting en incrementele belasting in SSIS
  • Incrementeel laden in SSIS met CDC of Change Data Capture
  • Incrementeel laden in SSIS met behulp van DateTime-kolommen
  • Hoe incrementeel te laden in SSIS met behulp van Lookup
  • De beste tool voor het laden van SSIS-gegevens

Elke sectie zal subsecties hebben. U kunt naar het gewenste onderwerp springen door op de links te klikken.

Laten we, voordat we met de voorbeelden beginnen, de incrementele belasting vergelijken met het tegenovergestelde, de volledige belasting.

Wat zijn volledige belasting en incrementele belasting in ETL

Welke ETL-tools u ook gebruikt, volledige en incrementele belastingen hebben dezelfde betekenis. Laten we ze hieronder beschrijven.

Volledige lading in ETL

Zoals de naam al doet vermoeden, laadt Full Load in ETL ALLE gegevens van de bron naar de bestemming. Een doeltabel wordt afgekapt voordat alles van de bron wordt geladen. Daarom staat deze techniek ook bekend als Destructieve belasting . Deze techniek is ook gemakkelijker te doen. En dit zorgt ook voor de hoogste data-integriteit. Maar de omvang van uw gegevens is vandaag groter dan gisteren. Dus als je dit gebruikt voor steeds groter wordende gegevens, zal het proces in de loop van de tijd langzamer worden.

ETL-gebruikscasussen bij volledige belasting

  • De omvang van de brongegevens is klein en zal de komende jaren niet significant groeien. Voorbeelden zijn een lijst met kleuren, een paar categorieën/classificaties, een lijst met landen en steden en nog veel meer.
  • Het is moeilijk te zeggen wat nieuw of gewijzigd is in de bron.
  • Gegevens moeten exact hetzelfde zijn van de bron tot de bestemming
  • De geschiedenis van de gegevens is niet relevant en wordt vaker overschreven

Incrementele belasting in ETL

Ondertussen is Incremental Load ook zoals de naam suggereert. Alleen de gewijzigde gegevens worden van de bron naar de bestemming geladen. Dit gebeurt stapsgewijs in de tijd. Degenen die niet zijn veranderd, blijven zoals ze zijn. Dit is een beetje moeilijk om te doen. U moet ervoor zorgen dat alle wijzigingen zijn verzameld en naar de bestemming zijn geladen. Maar dit werkt sneller dan Full Load op zeer grote gegevens.

ETL-gebruiksscenario's voor incrementele belasting

  • De gegevensomvang is erg groot en het opvragen zal erg traag zijn voor grote resultatensets
  • Wijzigingen zijn eenvoudig op te vragen
  • Verwijderde gegevens moeten op de bestemming worden bewaard, zoals een auditsysteem

Wat is incrementele belasting in SSIS

De basiscomponenten van een incrementele belasting in SSIS worden weergegeven in figuur 1.

Incrementeel laden in SSIS is meestal complexer, afhankelijk van uw vereisten. Maar de eenvoudige "receptenkaart" in Afbeelding 1 bevat stapsgewijs wat u nodig hebt om gegevens te "koken". Het vastleggen van veranderingen in de gegevens is het uitdagende deel. Je kunt de bestemming verknoeien als je niet oppast.

In de volgende secties zult u zien hoe u incrementele belasting in SSIS kunt doen met voorbeelden. Deze omvatten het gebruik van ChangeData Capture (CDC), DateTime-kolommen en lookups. U zult ook zien hoe dit wordt gedaan met behulp van Devart SSIS-componenten.

Laten we in de volgende sectie incrementele belasting vergelijken met volledige belasting in SSIS.

Het verschil tussen volledige belasting en incrementele belasting in SSIS

U hebt al gezien hoe incrementele belasting eruitziet in SSIS (Afbeelding 1). Ondertussen, hier is hoe het gaat met de SSIS Full load in Afbeelding 2 hieronder.

Het verschil tussen volledige belasting en incrementele belasting in SSIS zit in het pakketontwerp. Een ontwerp met volledige belasting vereist minder componenten die naar het SSIS-pakket worden gesleept. Het is zo eenvoudig dat er weinig bij komt kijken. Dat is de reden waarom sommige ontwikkelaars, uit een vals gevoel van productiviteit, meestal hun toevlucht nemen tot deze techniek.

Maar elke nacht een ontwerppakket met volledige belasting uitvoeren is niet aan te raden voor grote gegevens, bijvoorbeeld 15 TB. Denk je dat het op tijd klaar zal zijn voordat gebruikers 's ochtends arriveren? Dat zal niet gebeuren omdat u probeert de records die helemaal niet zijn gewijzigd, opnieuw in te voegen. Als dat ongeveer 70% van de gegevens is, hebt u meer downtime nodig, afhankelijk van de serverbronnen.

Dat is onaanvaardbaar.

Dus hoe meer u incrementalload moet gebruiken voor deze scenario's. In de volgende paragrafen leert u hoe u gegevens sneller kunt laden met incrementeel laden.

Incrementeel laden van inSSIS met CDC

Laten we eerst eens kijken naar het gebruik van Change Data Capture (CDC). Merk op dat we van hier tot de volgende 3 voorbeelden eenvoudige voorbeelden gaan gebruiken. Het ontwerp van de verpakking zal het doel dus niet vertroebelen.

Voordat we met het voorbeeld beginnen, zal deze sectie het volgende behandelen:

  • Eerst, hoe CDC in een database en tabel in te schakelen
  • Vervolgens het SSIS-pakket maken voor incrementeel laden van SSIS met CDC
  • Eindelijk de resultaten uitvoeren en controleren

Afbeelding 3 toont de bestanddelen van dit voorbeeld.

Change Data Capture (CDC) registreert invoegingen, verwijderingen en updates in een tabel. Voordat je dit voorbeeld kunt laten werken, heb je een database en een tabel nodig die is geconfigureerd voor CDC.

CDC inschakelen in een database en tabel

Database- en tabelinstellingen zijn standaard ingesteld op zonder CDC. Om een ​​database CDC-enabled te maken, volgt hier de T-SQL-syntaxis:

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

Om te controleren of CDC inderdaad is ingeschakeld, voer je dit uit:

select name from sys.databases
where is_cdc_enabled=1

Als de naam van de database die u voor CDC hebt ingeschakeld verschijnt, bent u klaar om te gaan. Uw database is nu geschikt voor CDC.

Maar hier eindigt het niet. U moet aangeven welke tabel u wilt bijhouden voor eventuele wijzigingen. De sp_cdc_enable_table zal het lukken. Hieronder staat daar een voorbeeld van.

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

Het uitvoeren van de bovenstaande code zou moeten resulteren in soortgelijke berichten hieronder:

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

Die berichten zijn de 2 nieuwe SQL Server Agent-taken die zijn gemaakt na het inschakelen van een tabel voor CDC. Daarom heb je SQL Server Agent nodig om CDC te laten werken. Zie een screenshot in figuur 4.

Invoegingen, verwijderingen en updates uitvoeren op de sportsCarSales table registreert automatisch de wijzigingen in een andere tabel met de naam cdc.dbo_sportsCarSales_CT . Deze tabel heeft kolommen zoals het origineel. Zie een screenshot in figuur 5.

De _$operatie kolom in de linker tabel is van bijzonder belang. Mogelijke waarden voor deze kolom zijn 1(Verwijderen), 2 (Invoegen), 3 en 4 (Bijwerken). Update gebruikt 2 waarden:één voor kolomwaarden voor de update (dat is 3). En de andere voor kolomwaarden na de update (dat is 4). U kunt deze kolom controleren wanneer u de waarden controleert voordat u uw SSIS-pakket uitvoert. De CDC-bron en CDC-splitter componenten gebruiken deze tabel bij het identificeren van wijzigingen. Meer hierover in het volgende gedeelte.

Het SSIS-pakket maken voor incrementele belasting van SSIS met behulp van CDC

Hier zijn de stappen voor het maken van het SSIS-pakket met incrementele belasting met behulp van CDC. Dit veronderstelt dat u al een blanco pakket heeft in Visual Studio 2019. Ons doel hier is om de rijen uit de sportsCarSales te laden. tabelin de FactSportsCarSales feitentabel in een datawarehouse.

Hieronder volgt een samenvatting van de stappen:

STAP 1. Maak 2 databaseverbindingsmanagers
STAP 2. Sleep 2 CDC-besturingstaken naar de besturingsstroom
STAP 3. Sleep een gegevensstroomtaak en maak verbinding met de CDC-besturingstaak

STAP #1. Maak 2 databaseverbindingsmanagers

We hebben hier 2 databaseverbindingen nodig. Een daarvan is de ADO.Net-verbinding die moet verwijzen naar de CDC-enabled database. En maak vervolgens een OLE DB-verbinding met een datawarehouse als bestemming. Beide zijn SQL Server 2019-databases. Zie de figuren 6 en 7 dienovereenkomstig. In dit voorbeeld bevinden beide databases zich op dezelfde computer. En we gebruiken Windows-verificatie om verbinding te maken.

Dus, in de Verbindingsmanagers venster, klik met de rechtermuisknop en selecteer Nieuwe ADO.Net-verbinding . Vul vervolgens de server-, authenticatie- en database-instellingen in zoals te zien is in Afbeelding 6 hieronder.

Maak vervolgens een OLE DB-verbinding met het datawarehouse. Klik in het venster Verbindingsbeheer met de rechtermuisknop en selecteer Nieuwe OLE DB-verbinding . Vul vervolgens de server, authenticatie en databasenaam in. Specificeer hier het datawarehouse.

STAP #2. Sleep 2 CDC-besturingstaken naar de besturingsstroom

Er zijn twee dingen die we moeten doen nadat we een CDC-besturingstaak in de besturingsstroom hebben gesleept.

Markeer CDC-start

Eerst moeten we de CDC-besturingstaak configureren om CDC Start te markeren. En maak vervolgens een CDC State-tabel. Dit kan in één configuratievenster. Zie Afbeelding 8 hieronder.

Door de genummerde stappen in Afbeelding 9 te volgen, volgen de details.

  1. Selecteer de ADO.Net-verbinding die we in Afbeelding 6 hebben gemaakt.
  2. Selecteer vervolgens Mark CDC start .
  3. Klik op Nieuw om een ​​CDC-statusvariabele te maken. Er verschijnt dan een venster. Klik op OK om de standaard variabelenaam User::CDC_State te maken .
  4. Selecteer de ADO.Net-verbinding zodat we de CDC-status in die database kunnen opslaan.
  5. Klik op Nieuw om een ​​tabel te maken voor het opslaan van de status. Het script is al voor u gemaakt. Dus klik gewoon op Uitvoeren in het volgende venster.
  6. Selecteer vervolgens CDC_State als de staatsnaam.
  7. Klik ten slotte op OK .

Nadat u deze CDC-besturingstaak hebt geconfigureerd, voert u het pakket uit. U ziet nog geen records die naar de andere database zijn gekopieerd. Maar de statustabel (dbo.cdc_state ) wordt gevuld met beginwaarden.

Vanaf hier kunt u ervoor kiezen om deze CDC-besturingstaak uit te schakelen of deze opnieuw te overschrijven met nieuwe waarden in de volgende taak.

Verwerkingsbereik ophalen

Ofwel sleept u een nieuwe CDC-besturingstaak naar de besturingsstroom of overschrijft u de vorige. De configuratie is hetzelfde als in Afbeelding 9, behalve voor CDC-bediening (#2). Selecteer deze keer Verwerkingsbereik ophalen . Klik vervolgens op OK . Verbind dit later met de Data Flow Task in STAP #3.

Mark verwerkt bereik

Configureer de andere CDC-besturingstaak zoals de eerste, behalve deze keer, selecteer Verwerkt bereik markeren voor de CDC-bediening. Verbind de Data Flow Task in STAP #3 hiermee.

Stap #3. Sleep een gegevensstroomtaak en maak verbinding met de CDCControl-taak

Deze gegevensstroomtaak zal de extractie en het laden uitvoeren, zoals eerder in figuur 3 te zien is. Voordat we ingaan op de details van elke stap, volgt hier een samenvatting:

A. Een CDC-bron toevoegen
B. Voeg een CDC-splitter toe en sluit deze aan op de CDC-bron
C. Voeg een OLE DB-opdracht toe om records te verwijderen
D. Voeg een OLE DB-bestemming toe om records in te voegen
E. Nog een OLE DB-opdracht toevoegen om records bij te werken

Laten we er nu in duiken.

A. Een CDC-bron toevoegen

Sleep een CDC-bron component met instellingen zoals weergegeven in Afbeelding 9 hieronder.

Door de genummerde stappen in Afbeelding 9 te volgen, volgen de details:

  1. Selecteer eerst de ADO.Net-verbinding die we in Afbeelding 6 hebben gemaakt.
  2. Selecteer vervolgens de tabel met CDC-functionaliteit sportsCarSales .
  3. Selecteer de opname-instantie dbo_SportsCarSales .
  4. Selecteer vervolgens Net voor CDC-verwerkingsmodus. Hiermee worden alleen nettowijzigingen geretourneerd. Bekijk deze link voor een gedetailleerde beschrijving van elke verwerkingsmodus. U kunt ook klikken op Voorbeeld om te zien welke rijen worden opgenomen.
  5. Selecteer de CDC State-variabele die we eerder hebben gemaakt (Afbeelding 9).
  6. Klik ten slotte op OK .
B. Voeg een CDC-splitter toe en sluit deze aan op de CDC-bron

De enige vereiste van een CDC-splitter is een CDC-bron eraan voorafgaan. Sluit dus de CDC Source . aan eerder aan dit onderdeel. Dit scheidt de wijzigingen in invoegingen, updates en verwijderingen.

C. Een OLE DB-opdracht toevoegen om records te verwijderen

Eerst moet u dit onderdeel labelen als Records verwijderen (zie afbeelding 3). Sluit deze vervolgens aan op de CDC Splitter. Wanneer een prompt verschijnt, selecteer DeleteOutput voor de uitvoer en klik op OK .

Configureer vervolgens de OLE DB-opdracht Verbindingsmanagers tabblad. Zie afbeelding 10.

Vervolgens in de Componenteigenschappen tab, geef het DELETE-commando op voor het SQLCommand eigendom. De opdracht zou als volgt moeten zijn:

DELETE FROM FactSportsCarSales
WHERE SalesID = ?

Zie een screenshot in Afbeelding 11 hieronder.

Het vraagteken maakt een parameter aan voor SalesID . Elke Verkoop-ID waarde afkomstig van de CDCSplitter wordt gebruikt om rijen te verwijderen in de FactSportsCarSales tafel.

Vervolgens, in de Kolomtoewijzingen tabblad, wijs de SalesID . toe kolom van de tabel naar de parameter (Param_0 ) Zie afbeelding 12.

Klik ten slotte op OK.

D. Een OLE DB-bestemming toevoegen om records in te voegen

Sleep eerst een OLE DB-bestemming . Geef het vervolgens de naam Records invoegen . Sluit deze aan op de CDC-splitter . Selecteer vervolgens InsertOutput wanneer een vensterprompt verschijnt. Zie Afbeelding 14 voor de basisinstellingen.

Door de genummerde stappen in Afbeelding 13 te volgen, vindt u hieronder de details:

  1. Selecteer eerst de OLE DB-verbinding die we in Afbeelding 7 hebben gemaakt.
    Selecteer vervolgens de FactSportsCarSales feitentabel.
  2. Klik ten slotte op OK .
E. Een OLE DB-opdracht toevoegen om records bij te werken

Sleep nog een OLE DB-opdracht en label het Records bijwerken. Sluit het vervolgens aan op de CDC-splitter . Het kiest automatisch de UpdateOutput uitvoer. De Verbindingsmanagers tabinstelling moet hetzelfde zijn als in Afbeelding 11.

Maar het Component PropertiesSQLCommand zou een waarde als deze moeten hebben:

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

Het aantal vraagtekens in de bovenstaande code geeft aan hoeveel parameters u moet gebruiken vanaf Param_0 .De positie van parameters van Param_0 naar Param_5 is gerangschikt op basis van hun plaats in de code. Dus, Param_0 isfor ClientID , Param_1 is voor SportsCarID , enzovoort.

Bekijk de Kolomtoewijzingen in Afbeelding 15.

Na het configureren van CDC op database- en tabelniveau, kunt u testen of CDC werkt door rijen toe te voegen en te wijzigen. Laten we dus wat records aan de tabel toevoegen.


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

Om te zien of dit wordt vastgelegd in CDC, kunt u de cdc.dbo_sportsCarSales_CT opvragen tafel.

SELECT * FROM cdc.dbo_sportsCarSales_CT;

Bekijk de resultaten in het vastleggen van wijzigingsgegevens na het INSERT-commando in Afbeelding 15.

Dus, het heeft de inserts opgenomen. Dat is goed.

Probeer nu het SSIS-pakket eerder uit te voeren. Het resultaat zou hetzelfde moeten zijn als in Afbeelding 16 hieronder.

Figuur 16 . Runtime-resultaat van SSIS-pakket voor incrementeel laden met CDC.

En tot slot, het opvragen van de resultaten in de FactSportsCarSales tabel onthult dezelfde set van 4 records.

Incrementeel laden in SSIS met behulp van DateTime-kolommen

Incrementeel laden in SSIS met behulp van DateTimecolumns is een andere manier om gegevens in stappen te verzamelen. Als je toevallig ETL doet in een tabel zonder CDC, is dit je volgende optie.

De brontabel heeft mogelijk een Aangepast of Laatste Update kolom zoals die in Afbeelding 17.

Als u de wijzigingen wilt opvragen, moet u het maximum kennen Gewijzigd kolomwaarde van de bestemming. Vraag vervolgens alle records van de bron op die groter zijn dan de Gewijzigd kolomwaarde van de bestemming.

De typische ingrediënten van deze techniek worden getoond in figuur 18.

Volg de aanwijzingen voor het bereiden van dit soort incrementele lading. Dit zijn de subonderwerpen voor deze sectie:

  • Het pakket maken om SSIS incrementeel te laden met DateTime-kolommen
  • Runtime-resultaten van pakket

Het pakket maken om SSIS incrementeel te laden met DateTime-kolommen

Ons doel is om de SportsCars . te laden tabel in dimSportsCars dimensietabel in een andere database. Het volgende is een samenvatting van de stappen:

STAP 1. Maak 2 OLE DB-verbindingsmanagers
STAP 2. Maak 2 pakketvariabelen
STAP 3. Voeg een SQL-taak uitvoeren toe in de controlestroom
STAP 4. Voeg een Gegevensstroomtaak toe

Laten we beginnen.

STAP #1. Maak 2 OLE DB-verbindingsbeheerders

De eerste OLE DB-verbinding is afkomstig van een transactiedatabase. En de instellingen zijn eenvoudig, zoals weergegeven in Afbeelding 19.

Maak vervolgens nog een OLE DB-verbinding met het datawarehouse. Dit zou hetzelfde moeten zijn als in figuur 7.

STAP #2. Maak 2 pakketvariabelen

De eerste variabele bevat de laatste wijzigingsdatum van de dimSportsCars maat tafel. Dan zal de tweede de aangepaste SQL-query bevatten.

A. Maak de User::sportsCars_lastUpdate-variabele
  1. In de Variabelen venster, klik op Variabele toevoegen .
  2. Noem het sportsCars_lastupdate .
  3. Stel het gegevenstype in op DateTime .
B. Maak de User::sqlCommand-variabele
  1. In de Variabelen venster, klik op Variabele toevoegen .
  2. Noem het sqlCommand .
  3. Stel het type in op String .
  4. Klik op de ellipsknop om de Expressie . te maken . Zie Afbeelding 21 voor de Expression Builder venster en de eigenlijke tekenreeksexpressie.
  5. Klik op OK .

De SQL-string zou er zo uit moeten zien:

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

Merk op dat we de WHERE-component hebben ingesteld op Modified groter dan Gebruiker::sportsCars_lastupdate .

Er zullen meer details zijn over het instellen van de 2 variabelen in de volgende stappen.

STAP #3. Voeg een SQL-taak uitvoeren toe aan de besturingsstroom

Deze taak zal de bestemmingstabel doorzoeken om de laatste Gewijzigd . te krijgen datum waarde. Sleep een SQL-taak uitvoeren naar de controlestroom. Label het vervolgens Laatst gewijzigde datum ophalen van DW . Zie dan de instellingen in Afbeelding 21.

De belangrijke eigenschappen die hier moeten worden ingesteld, zijn de Verbinding , SQLStatement , en ResultSet eigenschappen.

Stel de Verbinding . in eigenschap toe aan de tweede OLE DB-verbinding die is ingesteld in STAP #1. Stel vervolgens de SQLStatement . in eigendom toe aan de onderstaande code.

select max(modified) as LastUpdate from dimSportsCars

Stel vervolgens de ResultSet . in eigenschap naar een Enkele rij .

Ten slotte moet u de LastUpdate . in kaart brengen kolomalias (zie bovenstaande code) naar de User::sportsCars_lastupdate variabel. Zie een screenshot in Afbeelding 22.

Klik ten slotte op OK om de nieuwe instellingen op te slaan.

STAP #4. Een gegevensstroomtaak toevoegen

Sleep een Gegevensstroomtaak aan de besturingsstroom en verbind de SQL-taak uitvoeren ernaar toe. Label vervolgens de Gegevensstroomtaak DimSportsCars-dimensie bijwerken . Volg daarna de stappen om componenten toe te voegen aan de Data Flow Task .

De Gegevensstroomtaak heeft verschillende stappen erin:

A. Een OLE DB-bron toevoegen
B. Voeg een opzoektransformatie toe om de bron met de bestemming te vergelijken
C. Voeg een OLE DB-opdracht toe om records bij te werken
D. Voeg een OLE DB-bestemming toe om records in te voegen

Laten we nu beginnen.

A. Een OLE DB-bron toevoegen

Deze OLE DB-bron zal de brontabel opvragen voor de gewijzigde records. Zie de instellingen in Afbeelding 23.

Na de nummers in Afbeelding 23 volgen hier de details:

  1. Geef eerst de OLE DB-verbinding op die we hebben gemaakt. Zie afbeelding 20.
  2. Stel vervolgens de Gegevenstoegangsmodus . in naar SQL-opdracht van de variabele .
  3. Selecteer vervolgens de variabele User::sqlCommand die we eerder hebben gemaakt. Zie afbeelding 21.
  4. Klik ten slotte op OK .
B. Een opzoektransformatie toevoegen om de bron met de bestemming te vergelijken

Nu moeten we een manier hebben om de bron- en doeltabellen te vergelijken. We kunnen de Lookup . gebruiken Transformatiecomponent om dat te doen. Dit zal een join uitvoeren tussen de 2 tabellen.

Sleep dus een zoekopdracht Transformatie in de gegevensstroom en noem het Classificeer de wijziging . Verbind het vervolgens met de OLE DB-bron eerder. Dubbelklik erop. Zie Afbeelding 24 voor het instellen van de Algemeen pagina.

Stel de vervolgkeuzelijst in op Rijen omleiden naar geen overeenkomende uitvoer zoals te zien is in figuur 24. Dit betekent dat we de rijen gaan gebruiken die geen overeenkomst hebben. En in dit geval is dit voor het detecteren van rijen die aanwezig zijn in de bron, maar niet in de bestemming.

Klik vervolgens op de Verbinding pagina in het linkerdeelvenster van de Lookup Transformation Editor . Zie vervolgens Afbeelding 25 over wat u moet instellen.

In Afbeelding 26 moet u de OLE DB-verbinding voor de doeltabel specificeren. (Zie afbeelding 7). Stel vervolgens de SQL-query in op de onderstaande code.

SELECT SportsCarID from dimSportsCars

We hebben alleen de SportsCarID . nodig kolomom te vergelijken, dus hebben we een zoekopdracht gebruikt in plaats van de hele tabel.

Klik vervolgens op de Kolommen pagina om de toewijzing van de bronquerysleutelkolom aan de bestemming in te stellen. Zie Afbeelding 26 voor de toewijzing.

Zoals te zien is in Afbeelding 26, moet er een lijn zijn van de bron naar de bestemming met behulp van de SportsCarID sleutel kolom. Beide sleutelkolommen worden gebruikt voor de vergelijking.

Klik ten slotte op OK .

C. Een OLE DB-opdracht toevoegen om records bij te werken

Dit deel zal de records bijwerken die overeenkomen met SportsCarID sleutelwaarden uit de Lookup Transformatie.

Sleep dus een OLE DB-opdracht in de gegevensstroom en noem het DimSportsCars bijwerken . Verbind het vervolgens met de Lookup Transformatie eerder. Wanneer een prompt verschijnt, stelt u de Uitvoer . in om Overeenkomstuitvoer op te zoeken . Klik vervolgens op OK .

Dubbelklik op de OLE DB-opdracht en stel de eigenschappen in in de Verbindingsmanagers tabblad. Zie afbeelding 27.

Afbeelding 27 laat zien dat u de Connection Manager . moet instellen naar de doeldatabase (zie afbeelding 8). Klik vervolgens op de Componenteigenschappen tabblad. Zie Afbeelding 28 voor de instellingen van de eigenschappen.

De eigenschap SQLCommand is ingesteld op:

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

We hebben al eerder iets soortgelijks gedaan. De vraagtekens zijn tijdelijke aanduidingen voor parameters. En als we de juiste bronkolom in kaart brengen, wordt de bijbehorende doelkolom ingesteld. Zie de toewijzingen in Afbeelding 29.

Klik ten slotte op OK .

D. Een OLE DB-bestemming toevoegen om records in te voegen

Dit deel zal nieuwe records invoegen die gevonden zijn in de SportsCars tafel in de dimSportsCars maattabel.

Sleep dus een OLE DB-bestemming component en noem het Voeg nieuwe records toe in dimSportsCars. Dubbelklik erop en stel de verbindings- en doeltabel in. Zie afbeelding 30.

Zoals weergegeven in Afbeelding 30, stelt u de verbinding met het datawarehouse in (Afbeelding 8) en selecteert u de dimSportsCars maattabel.

Klik vervolgens op de Mappings pagina om te zien of kolommen dienovereenkomstig zijn toegewezen. Aangezien kolomnamen hetzelfde zijn in zowel de bron als het doel, worden ze automatisch toegewezen.

Klik ten slotte op OK .

Runtime-resultaten van pakket

Nu het pakket compleet is, is hier een screenshot van het resultaat in Afbeelding 31.

Het proces heeft 8 rijen bijgewerkt en 1 nieuwe rij ingevoegd in de dimSportsCars maattabel.

Incrementeel laden in SSIS met behulp van opzoeken

Een andere methode om incrementeel te laden is om de bron van het doel te vergelijken om te zien wat moet worden ingevoegd, bijgewerkt en verwijderd. En dit is uw optie als er geen DateTime-kolom en geen CDCon beide tabellen zijn. Een manier om dit te doen is door Lookup . te gebruiken Transformatie.

De typische ingrediënten van deze aanpak zijn weergegeven in figuur 32.

Merk op dat de eenvoudige benadering in Afbeelding 32 van toepassing is op tabellen die geen harde verwijdering toestaan. Als verwijderingen moeten worden afgehandeld, kan een Merge Join met een volledige join van toepassing zijn.

Er zijn 2 subonderwerpen voor deze sectie:

Het SSIS-pakket maken voor de incrementele belasting van SSIS met behulp van Lookup
Runtime-resultaten van pakket

Laten we erin duiken.

Het SSIS-pakket maken voor de SSIS Incremental Load met behulp van Lookup

Ons doel hier is om de rijen van Fabrikanten te laden tabel in de dimFabrikanten maattabel.

Dit veronderstelt dat je een leeg SSIS-pakket klaar hebt staan.

Hieronder volgt een samenvatting van de stappen:

STAP 1. Maak 2 OLE DB-verbindingen
STAP 2. Een gegevensstroomtaak toevoegen

Laten we beginnen met het voorbeeld.

STAP #1. Maak 2 OLE DB-verbindingen

U kunt verwijzen naar Afbeelding 19 voor de bron en Afbeelding 7 voor het doel. We gebruiken hier dezelfde verbindingsmanagers.

STAP #2. Een gegevensstroomtaak toevoegen

Sleep een Gegevensstroomtaak in de regelstroom en noem deze Dimensietabel fabrikant bijwerken. Dubbelklik erop en volg de volgende stappen. Hieronder worden de stappen samengevat binnen de Data Flow Task .

A. Een OLE DB-bron toevoegen
B. Een zoekopdracht toevoegen Transformatie om naar nieuwe records te scannen
C. Een OLE DB-bestemming toevoegen records in te voegen.
D. Nog een zoekopdracht toevoegen Transformatie om te scannen op veranderingen
E. Voeg een OLE DB-opdracht toe om de doeltabel bij te werken

A. Een OLE DB-bron toevoegen

Sleep een OLE DB-bron en label het Fabrikanten . Stel de Verbindingsmanager in zoals te zien in Afbeelding 33.

B. Een opzoektransformatie toevoegen om naar nieuwe records te scannen

Deze zoekopdracht Transformation scant naar records die niet bestaan ​​in het doel op basis van de Fabrikant-ID sleutelkolom. En alle niet-overeenkomende rijen zijn kandidaten voor tabelinvoeging.

Sleep een zoekopdracht transformatie en noem het Zoek dimFabrikanten op. Dubbelklik er vervolgens op.

De instellingen voor de Algemeen pagina moet hetzelfde zijn als in Afbeelding 24. Stel ondertussen de verbinding met het datawarehouse in en gebruik een query voor de Verbindingen pagina instellingen. Zie afbeelding 34.

C. Een OLE DB-bestemming toevoegen om records in te voegen

Sleep een OLE DB-bestemming en noem het Nieuwe records invoegen. Verbind het met de Lookup Transformatie en selecteer Lookup No Match Output wanneer een prompt verschijnt. Dubbelklik erop en stel de verbindings- en doeltabel in zoals te zien is in Afbeelding 35.

De bron- en doeltabellen hebben dezelfde kolomnamen en worden automatisch toegewezen. Zie afbeelding 36.

Klik ten slotte op OK .

D. Voeg nog een opzoektransformatie toe om te scannen op wijzigingen

In tegenstelling tot de vorige Zoeken Transformatie, deze scant op wijzigingen in de Fabrikant kolom. En als er wijzigingen zijn, is het een kandidaat voor tafelupdate.

Sleep nog een zoekopdracht Transformatie en noem het Zoek records op die zijn gewijzigd. Verbind het met de eerste Lookup Transformatie. De Algemeen pagina voor deze zoekopdracht moet hetzelfde zijn als in Afbeelding 24.

Ondertussen is de Verbinding pagina zou eruit moeten zien als Afbeelding 37 hieronder.

Let ondertussen op de toewijzingen in Afbeelding 38.

Afbeelding 38 toont toewijzingen via Fabrikant naam. Als het niet gelijk is, is er een verandering in de bron. En het moet in het doel worden gekopieerd.

E. Voeg een OLE DB-opdracht toe om de doeltabel bij te werken

De instellingen moeten hetzelfde zijn als in Afbeelding 29, behalve het SQLCommand . Het UPDATE-commando zou er als volgt uit moeten zien:

UPDATE dimManufacturers
set manufacturer = ?
where manufacturerID = ?

Pas de kolomtoewijzingen dienovereenkomstig aan de parameters aan.

Runtime-resultaten van pakket

Klaar? Voer vervolgens het pakket uit. U ziet dezelfde runtime-resultaten als in Afbeelding 39.

De beste tool voor het laden van SSIS-gegevens

Alle voorbeelden die we eerder hadden, gebruiken de kant-en-klare componenten die van Microsoft komen. Hoewel het voor sommige projecten goed genoeg is, wat als u zowel cloud- als databasebronnen via SSIS moet integreren?

Dit is waar Devart SSIS-componenten in het spel komen. Deze SSIS-componenten zijn handig in gebruik. En ze bieden high-performance gegevensladen met behulp van gegevensbronspecifieke optimalisaties en geavanceerde caching. Ze hebben ook meer dan 40 gegevensbronnen, waaronder RDBMS-favorieten zoals MySQL, PostgreSQL en Oracle. Ook inbegrepen zijn cloudservices zoals Salesforce, HubSpot, Google Analytics en nog veel meer. So, it’s worth a try to load millions of records in SSIS using Devart SSIS Components.

Why not an example?

Using Devart SSIS Components to Do Incremental Load

Let’s try replicating the dimManufacturers table into MySQL, and use Devart’s Lookup and Destination components for MySQL. The recipe is shown in Figure 40.

Let’s begin by adding a new SSIS package toyour Visual Studio Integration Services project. Then, add a Data FlowTask and double-click it. Then, follow the steps below.

Before that, here’s a summary of the steps:

STEP #1. Add an OLE DB Source
STEP #2. Add a Devart MySQL Connection Manager
STEP #3. Add a Devart MySQL Lookup to scan for new records
STEP #4. Add another Devart MySQL Lookup Transformation to scan for changes
STEP #5. Add a Devart MySQL Destination to insert records
STEP #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 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.

Conclusion

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. Hoe het huidige transactieniveau te vinden?

  2. hoe de grootte van een kolom te wijzigen

  3. Supersnel de opdrachtregel van de mysql-database importeren

  4. Meerdere rijen invoegen in MySQL