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 Command
zal 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 Task
voert de instructie uitTRUNCATE TABLE dbo.StagingTable
tegen de doeldatabase om de staging-tabellen af te kappen. -
De volgende sectie legt uit hoe de
Data Flow Task
is geconfigureerd. -
Tweede
Execute SQL Task
voert 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 Source
leest gegevens uitdbo.SourceTable
met behulp van de SQL-opdrachtSELECT RowNumber,CreatedOn, ModifiedOn FROM Source.dbo.SourceTable WHERE IsActive = 1
-
Lookup transformation
wordt 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 Destination
genoemd alsInsert into destination table
, die de rij invoegt indbo.DestinationTable
-
Als het record bestaat , wordt het omgeleid naar de
OLE DB Destination
genoemd 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.