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'istruzioneTRUNCATE 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 indbo.DestinationTable
utilizzando 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 Source
legge i dati dadbo.SourceTable
utilizzando il comando SQLSELECT RowNumber,CreatedOn, ModifiedOn FROM Source.dbo.SourceTable WHERE IsActive = 1
-
Lookup transformation
viene utilizzato per verificare se il valore RowNumber esiste già nella tabelladbo.DestinationTable
-
Se il record non esiste, verrà reindirizzato alla
OLE DB Destination
denominato comeInsert into destination table
, che inserisce la riga indbo.DestinationTable
-
Se il record esiste , verrà reindirizzato alla
OLE DB Destination
denominato 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.