Voorbeeldpakket met SSIS 2008 R2 dat wordt ingevoegd of bijgewerkt met behulp van batchbewerking:
Hier is een voorbeeldpakket geschreven in SSIS 2008 R2 dat illustreert hoe invoegen, updaten tussen twee databases wordt uitgevoerd met behulp van batchbewerkingen.
- Gebruik
OLE DB Commandzal de update-bewerkingen op uw pakket vertragen omdat dit niet . doet batchbewerkingen uitvoeren. Elke rij wordt afzonderlijk bijgewerkt.
Het voorbeeld gebruikt twee databases namelijk Source en Destination . In mijn voorbeeld bevinden beide databases zich op de server, maar de logica kan nog steeds worden toegepast voor databases die zich op verschillende servers en locaties bevinden.
Ik heb een tabel gemaakt met de naam dbo.SourceTable in mijn brondatabase Source .
CREATE TABLE [dbo].[SourceTable](
[RowNumber] [bigint] NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[ModifiedOn] [datetime] NOT NULL,
[IsActive] [bit] NULL
)
Er zijn ook twee tabellen gemaakt met de naam dbo.DestinationTable en dbo.StagingTable in mijn bestemmingsdatabase Destination .
CREATE TABLE [dbo].[DestinationTable](
[RowNumber] [bigint] NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[ModifiedOn] [datetime] NOT NULL
)
GO
CREATE TABLE [dbo].[StagingTable](
[RowNumber] [bigint] NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[ModifiedOn] [datetime] NOT NULL
)
GO
Ongeveer 1,4 miljoen rijen ingevoegd in de tabel dbo.SourceTable met unieke waarden in RowNumber kolom. De tabellen dbo.DestinationTable en dbo.StagingTable waren om te beginnen leeg. Alle rijen in de tabel dbo.SourceTable hebben de vlag IsActive ingesteld op false.

Een SSIS-pakket gemaakt met twee OLE DB-verbindingsbeheerders, die elk verbinding maken met Source en Destination databanken. De besturingsstroom ontworpen zoals hieronder weergegeven:
-
Eerste
Execute SQL Taskvoert de instructie uitTRUNCATE TABLE dbo.StagingTabletegen de doeldatabase om de staging-tabellen af te kappen. -
De volgende sectie legt uit hoe de
Data Flow Taskis geconfigureerd. -
Tweede
Execute SQL Taskvoert de onderstaande SQL-instructie uit die gegevens indbo.DestinationTable. bijwerkt gebruikmakend van de gegevens die beschikbaar zijn indbo.StagingTable, ervan uitgaande dat er een unieke sleutel is die overeenkomt tussen die twee tabellen. In dit geval is de unieke sleutel de kolomRowNumber.
Script om bij te werken:
UPDATE D
SET D.CreatedOn = S.CreatedOn
, D.ModifiedOn = S.ModifiedOn
FROM dbo.DestinationTable D
INNER JOIN dbo.StagingTable S
ON D.RowNumber = S.RowNumber

Ik heb de gegevensstroomtaak ontworpen zoals hieronder weergegeven.
-
OLE DB Sourceleest gegevens uitdbo.SourceTablemet behulp van de SQL-opdrachtSELECT RowNumber,CreatedOn, ModifiedOn FROM Source.dbo.SourceTable WHERE IsActive = 1 -
Lookup transformationwordt gebruikt om te controleren of de RowNumber-waarde al bestaat in de tabeldbo.DestinationTable -
Als het record niet bestaat, wordt deze omgeleid naar de
OLE DB Destinationgenoemd alsInsert into destination table, die de rij invoegt indbo.DestinationTable -
Als het record bestaat , wordt het omgeleid naar de
OLE DB Destinationgenoemd alsInsert into staging table, die de rij invoegt indbo.StagingTable. Deze gegevens in de staging-tabel worden gebruikt in de tweede `SQL-taak uitvoeren om batch-update uit te voeren.

Om nog een paar rijen voor OLE DB Source te activeren, heb ik de onderstaande query uitgevoerd om enkele records te activeren
UPDATE dbo.SourceTable
SET IsActive = 1
WHERE (RowNumber % 9 = 1)
OR (RowNumber % 9 = 2)

De eerste uitvoering van het pakket zag er als volgt uit. Alle rijen werden naar de doeltabel geleid omdat deze leeg was. De uitvoering van het pakket op mijn computer duurde ongeveer 3 seconds .


Voer de query voor het aantal rijen opnieuw uit om het aantal rijen in alle drie de tabellen te vinden.

Om nog een paar rijen voor OLE DB Source te activeren, heb ik de onderstaande query uitgevoerd om enkele records te activeren
UPDATE dbo.SourceTable
SET IsActive = 1
WHERE (RowNumber % 9 = 3)
OR (RowNumber % 9 = 5)
OR (RowNumber % 9 = 6)
OR (RowNumber % 9 = 7)

De tweede uitvoering van het pakket zag er uit zoals hieronder weergegeven. 314,268 rows die eerder waren ingevoegd tijdens de eerste uitvoering, werden omgeleid naar de staging-tabel. 628,766 new rows werden rechtstreeks in de bestemmingstabel ingevoegd. De uitvoering van het pakket op mijn computer duurde ongeveer 12 seconds . 314,268 rows in de bestemmingstabel zijn bijgewerkt in de tweede SQL-taak uitvoeren met de gegevens met behulp van de staging-tabel.


Voer de query voor het aantal rijen opnieuw uit om het aantal rijen in alle drie de tabellen te vinden.

Ik hoop dat dit je een idee geeft om je oplossing te implementeren.