sql >> Database >  >> RDS >> Sqlserver

Hoe optimaliseer ik de werking van Upsert (bijwerken en invoegen) binnen het SSIS-pakket?

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 uit TRUNCATE 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 in dbo.DestinationTable . bijwerkt gebruikmakend van de gegevens die beschikbaar zijn in dbo.StagingTable , ervan uitgaande dat er een unieke sleutel is die overeenkomt tussen die twee tabellen. In dit geval is de unieke sleutel de kolom RowNumber .

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 uit dbo.SourceTable met behulp van de SQL-opdracht SELECT 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 tabel dbo.DestinationTable

  • Als het record niet bestaat, wordt deze omgeleid naar de OLE DB Destination genoemd als Insert into destination table , die de rij invoegt in dbo.DestinationTable

  • Als het record bestaat , wordt het omgeleid naar de OLE DB Destination genoemd als Insert into staging table , die de rij invoegt in dbo.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.



  1. Waarom Sequelize-migratie een tabel maken, maar modellen kunnen geen verbinding maken met een database?

  2. STRING_SPLIT in MySql - hoe doe je dat?

  3. Mysql left join met voorwaarde in rechtertabel

  4. CakePHP Database verbinding Mysql ontbreekt, of kon niet worden aangemaakt