Sugiro ler os dados em partes:
Em vez de carregar a tabela inteira, tente dividir os dados em partes e importá-los para o SQL Server. De uns tempos pra cá, respondi uma resposta parecida relacionada ao SQLite, vou tentar reproduzi-la para caber na sintaxe do Oracle:
Guia passo a passo
Neste exemplo, cada bloco contém 10.000 linhas.
- Declare 2 variáveis do tipo
Int32
(@[User::RowCount]
e@[User::IncrementValue]
) - Adicione uma
Execute SQL Task
que executam umselect Count(*)
comando e armazene o conjunto de resultados na variável@[User::RowCount]
- Adicione um loop For com as seguintes preferências:
- Dentro do contêiner de loop for, adicione uma
Data flow task
- Dentro da tarefa de fluxo de dados, adicione uma
ODBC Source
eOLEDB Destination
- Na Fonte ODBC, selecione
SQL Command
opção e escreva umSELECT * FROM TABLE
query *(para recuperar apenas metadados` - Mapeie as colunas entre origem e destino
- Volte para o
Control flow
e clique naData flow task
e pressione F4 para ver a janela de propriedades -
Na janela de propriedades vá para expressão e Atribua a seguinte expressão a[ODBC Source].[SQLCommand]
propriedade:(para mais informações, consulte Como passar variáveis SSIS na expressão ODBC SQLCommand?)
"SELECT * FROM MYTABLE ORDER BY ID_COLUMN OFFSET " + (DT_WSTR,50)@[User::IncrementValue] + "FETCH NEXT 10000 ROWS ONLY;"
Onde
MYTABLE
é o nome da tabela de origem e IDCOLUMN
é sua chave primária ou coluna de identidade. Captura de tela do fluxo de controle
Referências
- Origem ODBC - SQL Server
- Como passar variáveis SSIS na expressão ODBC SQLCommand?
- COMO USAR A FONTE ODBC SSIS E A DIFERENÇA ENTRE OLE DB E ODBC?
- Como limito o número de linhas retornadas por uma consulta do Oracle após o pedido?
- Obtendo de n a n linhas do db2
Atualização 1 - Outras soluções possíveis
Ao pesquisar problemas semelhantes, encontrei algumas soluções alternativas adicionais que você pode tentar:
(1) Alterar a memória máxima do SQL Server
-
SSIS:O gerenciador de buffer falhou em uma chamada de alocação de memória
sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'max server memory', 4096; GO RECONFIGURE; GO
(2) Ativar pipes nomeados
-
[Correção] O gerenciador de buffer detectou que o sistema estava com pouca memória virtual, mas não conseguiu trocar nenhum buffer
- Vá para Painel de Controle -> Ferramentas Administrativas -> Gerenciamento do Computador
- On Protocol for SQL Instance -> Set Named Pipes =
Enabled
- Reiniciar o serviço de instância SQL
- Depois disso, tente importar os dados e ele buscará os dados em partes agora, em vez de buscar todos de uma vez. Espero que funcione para vocês e economize seu tempo.
(3) Se estiver usando o SQL Server 2008, instale hotfixes
- O processo de tempo de execução do SSIS 2008 falha quando você executa o pacote do SSIS 2008 em uma condição de pouca memória
Atualização 2 - Entendendo o erro
No seguinte link do MSDN, a causa do erro foi descrita da seguinte forma:
A memória virtual é um superconjunto de memória física. Os processos no Windows normalmente não especificam quais devem ser usados, pois isso inibiria (muito) como o Windows pode realizar várias tarefas ao mesmo tempo. O SSIS aloca memória virtual. Se o Windows puder, todas essas alocações serão mantidas na memória física, onde o acesso é mais rápido. No entanto, se o SSIS solicitar mais memória do que a disponível fisicamente, essa memória virtual será transferida para o disco, tornando o pacote mais lento. E nos piores casos, se não houver memória virtual suficiente no sistema, o pacote falhará.