Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come si ottimizza l'operazione di inserimento (aggiornamento e inserimento) all'interno del pacchetto SSIS?

Pacchetto di esempio che utilizza SSIS 2008 R2 che inserisce o aggiorna utilizzando un'operazione batch:

Ecco un pacchetto di esempio scritto in SSIS 2008 R2 che illustra come eseguire l'inserimento, l'aggiornamento tra due database utilizzando operazioni batch.

  • Utilizzo di OLE DB Command rallenterà le operazioni di aggiornamento sul tuo pacchetto perché non eseguire operazioni batch. Ogni riga viene aggiornata individualmente.

L'esempio utilizza due database:Source e Destination . Nel mio esempio, entrambi i database risiedono sul server ma la logica può ancora essere applicata a database che risiedono su server e posizioni diversi.

Ho creato una tabella denominata dbo.SourceTable nel mio database di origine Source .

CREATE TABLE [dbo].[SourceTable](
    [RowNumber] [bigint] NOT NULL,
    [CreatedOn] [datetime] NOT NULL,
    [ModifiedOn] [datetime] NOT NULL,
    [IsActive] [bit] NULL
)

Inoltre, sono state create due tabelle denominate dbo.DestinationTable e dbo.StagingTable nel mio database di destinazione 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

Inserite circa 1,4 milioni di righe nella tabella dbo.SourceTable con valori univoci in RowNumber colonna. Le tabelle dbo.DestinationTable e dbo.StagingTable erano vuoti per cominciare. Tutte le righe della tabella dbo.SourceTable avere il flag IsActive impostato su falso.

Creato un pacchetto SSIS con due gestori di connessione OLE DB, ciascuno connesso a Source e Destination banche dati. Progettato il flusso di controllo come mostrato di seguito:

  • Primo Execute SQL Task esegue l'istruzione TRUNCATE TABLE dbo.StagingTable rispetto al database di destinazione per troncare le tabelle di staging.

  • La prossima sezione spiega come l'Data Flow Task è configurato.

  • Secondo Execute SQL Task esegue l'istruzione SQL indicata di seguito che aggiorna i dati in dbo.DestinationTable utilizzando i dati disponibili in dbo.StagingTable , presupponendo che esista una chiave univoca che corrisponda tra queste due tabelle. In questo caso, la chiave univoca è la colonna RowNumber .

Script da aggiornare:

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

Ho progettato l'attività del flusso di dati come mostrato di seguito.

  • OLE DB Source legge i dati da dbo.SourceTable utilizzando il comando SQL SELECT RowNumber,CreatedOn, ModifiedOn FROM Source.dbo.SourceTable WHERE IsActive = 1

  • Lookup transformation viene utilizzato per verificare se il valore RowNumber esiste già nella tabella dbo.DestinationTable

  • Se il record non esiste, verrà reindirizzato alla OLE DB Destination denominato come Insert into destination table , che inserisce la riga in dbo.DestinationTable

  • Se il record esiste , verrà reindirizzato alla OLE DB Destination denominato come Insert into staging table , che inserisce la riga in dbo.StagingTable . Questi dati nella tabella di staging verranno utilizzati nel secondo `Esegui attività SQL per eseguire l'aggiornamento batch.

Per attivare alcune righe in più per l'origine OLE DB, ho eseguito la query seguente per attivare alcuni record

UPDATE  dbo.SourceTable 
SET     IsActive = 1 
WHERE   (RowNumber % 9 = 1) 
OR      (RowNumber % 9 = 2)

La prima esecuzione del pacchetto sembrava come mostrato di seguito. Tutte le righe sono state indirizzate alla tabella di destinazione perché era vuota. L'esecuzione del pacchetto sulla mia macchina ha richiesto circa 3 seconds .

Esegui nuovamente la query sul conteggio delle righe per trovare i conteggi delle righe in tutte e tre le tabelle.

Per attivare alcune righe in più per l'origine OLE DB, ho eseguito la query seguente per attivare alcuni record

UPDATE  dbo.SourceTable 
SET     IsActive = 1 
WHERE   (RowNumber % 9 = 3) 
OR      (RowNumber % 9 = 5) 
OR      (RowNumber % 9 = 6) 
OR      (RowNumber % 9 = 7)

La seconda esecuzione del pacchetto sembrava come mostrato di seguito. 314,268 rows che erano stati inseriti in precedenza durante la prima esecuzione sono stati reindirizzati alla tabella di staging. 628,766 new rows sono stati inseriti direttamente nella tabella di destinazione. L'esecuzione del pacchetto sulla mia macchina ha richiesto circa 12 seconds . 314,268 rows nella tabella di destinazione sono stati aggiornati nella seconda attività Esegui SQL con i dati utilizzando la tabella di staging.

Esegui nuovamente la query sul conteggio delle righe per trovare i conteggi delle righe in tutte e tre le tabelle.

Spero che questo ti dia un'idea per implementare la tua soluzione.