Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

SSIS falhando ao salvar pacotes e reinicializa o Visual Studio

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.
  1. Declare 2 variáveis ​​do tipo Int32 (@[User::RowCount] e @[User::IncrementValue] )
  2. Adicione uma Execute SQL Task que executam um select Count(*) comando e armazene o conjunto de resultados na variável @[User::RowCount]




  1. Adicione um loop For com as seguintes preferências:


  1. Dentro do contêiner de loop for, adicione uma Data flow task
  2. Dentro da tarefa de fluxo de dados, adicione uma ODBC Source e OLEDB Destination
  3. Na Fonte ODBC, selecione SQL Command opção e escreva um SELECT * FROM TABLE query *(para recuperar apenas metadados`
  4. Mapeie as colunas entre origem e destino
  5. Volte para o Control flow e clique na Data flow task e pressione F4 para ver a janela de propriedades

  6. 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
    1. Vá para Painel de Controle -> Ferramentas Administrativas -> Gerenciamento do Computador
    2. On Protocol for SQL Instance -> Set Named Pipes =Enabled
    3. Reiniciar o serviço de instância SQL
    4. 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á.