Suggerisco di leggere i dati in blocchi:
Invece di caricare l'intera tabella, provare a dividere i dati in blocchi e importarli in SQL Server. Da un po' di tempo ho risposto a una risposta simile relativa a SQLite, proverò a riprodurla per adattarla alla sintassi di Oracle:
Guida passo passo
In questo esempio ogni blocco contiene 10000 righe.
- Dichiara 2 variabili di tipo
Int32
(@[User::RowCount]
e@[User::IncrementValue]
) - Aggiungi un
Execute SQL Task
che eseguono unselect Count(*)
comando e memorizzare il set di risultati nella variabile@[User::RowCount]
- Aggiungi un ciclo For con le seguenti preferenze:
- All'interno del contenitore ciclo for aggiungi un
Data flow task
- All'interno dell'attività del flusso di dati aggiungi una
ODBC Source
eOLEDB Destination
- Nel Sorgente ODBC seleziona
SQL Command
opzione e scrivi unSELECT * FROM TABLE
query *(solo per recuperare i metadati` - Mappa le colonne tra origine e destinazione
- Torna al
Control flow
e fare clic suData flow task
e premi F4 per visualizzare la finestra delle proprietà -
Nella finestra delle proprietà vai su espressione e assegna la seguente espressione a
[ODBC Source].[SQLCommand]
proprietà:(per ulteriori informazioni fare riferimento a Come passare le variabili SSIS nell'espressione ODBC SQLCommand?)"SELECT * FROM MYTABLE ORDER BY ID_COLUMN OFFSET " + (DT_WSTR,50)@[User::IncrementValue] + "FETCH NEXT 10000 ROWS ONLY;"
Dove MYTABLE
è il nome della tabella di origine e IDCOLUMN
è la tua chiave primaria o colonna di identità.
Schermata del flusso di controllo
Riferimenti
- Origine ODBC - SQL Server
- Come passare le variabili SSIS nell'espressione ODBC SQLCommand?
- COME UTILIZZARE LA SORGENTE ODBC SSIS E LA DIFFERENZA TRA OLE DB E ODBC?
- Come faccio a limitare il numero di righe restituite da una query Oracle dopo l'ordine?
- Ottenere da n a n righe superiori da db2
Aggiornamento 1 - Altre possibili soluzioni alternative
Durante la ricerca di problemi simili ho trovato alcune soluzioni alternative aggiuntive che puoi provare:
(1) Modifica la memoria massima di SQL Server
-
SSIS:il Buffer Manager ha fallito una chiamata di allocazione della memoria
sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'max server memory', 4096; GO RECONFIGURE; GO
(2) Abilita pipe con nome
-
[Risolto] Il gestore del buffer ha rilevato che la memoria virtuale del sistema era insufficiente, ma non è stato in grado di sostituire alcun buffer
- Vai su Pannello di controllo –> Strumenti di amministrazione -> Gestione computer
- Su protocollo per istanza SQL -> Imposta pipe con nome =
Enabled
- Riavvia il servizio dell'istanza SQL
- Dopodiché, prova a importare i dati e ora recupererà i dati in blocchi invece di recuperarli tutti in una volta. Spero che funzioni per voi ragazzi e vi faccia risparmiare tempo.
(3) Se si utilizza SQL Server 2008, installare gli hotfix
- Il processo di runtime SSIS 2008 si arresta in modo anomalo quando si esegue il pacchetto SSIS 2008 in condizioni di memoria insufficiente
Aggiornamento 2 - Comprensione dell'errore
Nel seguente collegamento MSDN, la causa dell'errore è stata descritta come segue:
La memoria virtuale è un superset di memoria fisica. I processi in Windows in genere non specificano quale utilizzare, poiché ciò inibirebbe (molto) il modo in cui Windows può multitasking. SSIS alloca memoria virtuale. Se Windows è in grado di farlo, tutte queste allocazioni vengono mantenute nella memoria fisica, dove l'accesso è più rapido. Tuttavia, se SSIS richiede più memoria di quella fisicamente disponibile, la memoria virtuale si riversa su disco, rendendo il pacchetto più lento di ordini di grandezza. E nel peggiore dei casi, se non c'è abbastanza memoria virtuale nel sistema, il pacchetto fallirà.