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 Commandrallenterà 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 Taskesegue l'istruzioneTRUNCATE TABLE dbo.StagingTablerispetto al database di destinazione per troncare le tabelle di staging. -
La prossima sezione spiega come l'
Data Flow Taskè configurato. -
Secondo
Execute SQL Taskesegue l'istruzione SQL indicata di seguito che aggiorna i dati indbo.DestinationTableutilizzando i dati disponibili indbo.StagingTable, presupponendo che esista una chiave univoca che corrisponda tra queste due tabelle. In questo caso, la chiave univoca è la colonnaRowNumber.
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 Sourcelegge i dati dadbo.SourceTableutilizzando il comando SQLSELECT RowNumber,CreatedOn, ModifiedOn FROM Source.dbo.SourceTable WHERE IsActive = 1 -
Lookup transformationviene utilizzato per verificare se il valore RowNumber esiste già nella tabelladbo.DestinationTable -
Se il record non esiste, verrà reindirizzato alla
OLE DB Destinationdenominato comeInsert into destination table, che inserisce la riga indbo.DestinationTable -
Se il record esiste , verrà reindirizzato alla
OLE DB Destinationdenominato comeInsert into staging table, che inserisce la riga indbo.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.