Oracle
 sql >> Database >  >> RDS >> Oracle

SSIS non riesce a salvare i pacchetti e riavvia Visual Studio

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.

  1. Dichiara 2 variabili di tipo Int32 (@[User::RowCount] e @[User::IncrementValue] )
  2. Aggiungi un Execute SQL Task che eseguono un select Count(*) comando e memorizzare il set di risultati nella variabile @[User::RowCount]

  1. Aggiungi un ciclo For con le seguenti preferenze:

  1. All'interno del contenitore ciclo for aggiungi un Data flow task
  2. All'interno dell'attività del flusso di dati aggiungi una ODBC Source e OLEDB Destination
  3. Nel Sorgente ODBC seleziona SQL Command opzione e scrivi un SELECT * FROM TABLE query *(solo per recuperare i metadati`
  4. Mappa le colonne tra origine e destinazione
  5. Torna al Control flow e fare clic su Data flow task e premi F4 per visualizzare la finestra delle proprietà
  6. 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

    1. Vai su Pannello di controllo –> Strumenti di amministrazione -> Gestione computer
    2. Su protocollo per istanza SQL -> Imposta pipe con nome =Enabled
    3. Riavvia il servizio dell'istanza SQL
    4. 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à.