none
Armazenamento temporário de rows no OleDb Source e erro de baixa RRS feed

  • Pergunta

  • Pessoal,

    estou com problemas de baixa de dados no IS.

    Eu reparei pelos logs na janela OutPut, que o OleDbSource busca e armazena todas os registros em memória antes de passar para o componente seguinte, no meu caso LookUp. Quando a tabela de origem é pequena não tem problema, mas quando ela tem muitos registros (como seis milhões de registros), o processo fica extremamente lento, e a fase "Clean up" demora muito e gera um erro no DataTask seguinte. O erro é:

    “[OLE DB Source [1]] Error: SSIS Error Code DTS_E_OLEDBERROR.  An OLE DB error has occurred. Error code: 0x8004D01C. An OLE DB record is available.  Source: "IBM OLE DB Provider for DB2"  Hresult: 0x8004D01C  Description: " SQL30081N  A communication error has been detected.  Communication protocol being used: "TCP/IP".  Communication API being used: "SOCKETS".  Location where the error was detected: "172.16.3.203".  Communication function detecting the error: "recv". 
    Protocol specific error code(s): "10060", "*", "*".  SQLSTATE=08001 ".”


    Alguém pode me ajudar com isso?

    Obrigado.

    Att.
    Glaudson Silva


    Glaudson -- The Apprentice --
    terça-feira, 19 de maio de 2009 14:53

Respostas

  • Junio,

    desculpe a demora para dar um retorno...
    acabou que o problema ainda não foi resolvido... mas depois de tanto penar em testes... descobrimos que o problema não é aqui... (affffffffffffff).
    Está com algum problema no servidor dos dados... o pessoal de lá ainda não sabe exatamente o que é, estamos aguardando.
    E eu descobri que se você especificar restrição de memória no LookUp, o OleDbSource não busca todos os dados para a memória... (o que eu achei, inicialmente, que fosse o problema),  e sim busca-os de acordo com a memória definida.

    Agora eu tenho que aguardar...
    obrigado pela ajuda!


    Glaudson -- The Apprentice --
    • Marcado como Resposta Glaudson segunda-feira, 29 de junho de 2009 18:30
    segunda-feira, 29 de junho de 2009 18:30

Todas as Respostas

  • Glaudson,

    Não consegui entender o que você deseja fazer!!!


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    terça-feira, 19 de maio de 2009 16:27
    Moderador
  • Ola Junior,

    vou tentar de novo...

    Eu criei um projeto no SSIS que baixa os dados de um banco IBM DB2 e insere os mesmos no nosso banco SQL Server 2005. No banco DB2 existem vários schemas e aqui no projeto eu criei um Package para cada schema.
    No inicio dava tudo certo, mas o projeto foi aumentando e ficando muito pesado. São aproximadamente 200 Task(uma para cada tabela) dividos em 9 packages.
    Alguns packages são bem menores que outros, tendo a maioria tabelas de tipos (TipoSexo, TipoConta, etc), esses continuam baixando sem problemas. Mas packages que possue tabelas grandes não estão sendo baixados. Acontece aquele erro que postei anteriormente.
    Esse erro começou a dar semana passada, sem mais nem menos... por que eu não alterei nada nos pacotes e nada foi alterado na estrutura dos bancos também.

    Eu pensei que esse erro poderia dar por falta de memória, mas eu já tentei restringir com as propriedades DefaultBufferMaxRows e DefaultBufferSize da Task, mas não fez muita diferença.

    Eu observei as mensagens que surgem na janela OutPut do BIDS, e percebi que os registros são todos carregados para memória (através do OledbSource) antes de serem passados para o próximo componente, que no meu caso é o LookUp(que verifica se o registro já existe no meu banco). E pensei que o problema possa estar acontecendo por causa disso.

    As mensagens do output que eu estou falando são essas:

    Information: 0x400490F4 at Task1, Lookup [16]: component "Lookup" (16) has cached 975 rows.
    Information: 0x400490F4 at Task1, Lookup [16]: component "Lookup" (16) has cached 56550 rows.
    Information: 0x400490F4 at Task1, Lookup [16]: component "Lookup" (16) has cached 117975 rows.
    Information: 0x400490F4 at Task1, Lookup [16]: component "Lookup" (16) has cached 184275 rows.
    Information: 0x400490F4 at Task1, Lookup [16]: component "Lookup" (16) has cached 248625 rows.
    .
    .
    .
    Information: 0x400490F4 at Task1, Lookup [16]: component "Lookup" (16) has cached 1217775 rows.
    Information: 0x400490F5 at Task1, Lookup [16]: component "Lookup" (16) has cached a total of 1224102 rows.


    Ps: O package está configurado para executar apenas 2 Task simultaneamente, se eu aumento esse valor o erro acontece mais rápido (o que me faz acreditar que o problema está relacionado com a quantidade de dados que estão sendo trabalhados simultaneamente), e é por isso que eu queria saber se existe uma forma de configurar as Tasks para baixar, por exemplo, 1000 rows, tratá-las e as inserir no banco antes de baixar mais 1000.

    Desculpe pela redação...

    Entendeu?

    Glaudson -- The Apprentice --
    terça-feira, 19 de maio de 2009 17:00
  • Glaudson,

    Na verdade o seu problema esta na forma que o OleDBSource trabalha, ou seja, ele armazena tudo em memória antes de repassar estes dados para o próximo componente.

    É isso?


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    terça-feira, 19 de maio de 2009 17:25
    Moderador
  • Bom...
    na verdade, meu problema é os dados não serem baixados. E eu acho que é por causa disso... muito dado para ser processado de uma vez.
    Você conhece uma alternativa?
    Glaudson -- The Apprentice --
    terça-feira, 19 de maio de 2009 17:34
  • Glaudson,

    Uma vez realizei o seguinte, configurei vários OleDBSource, onde cada um filtrava parte dos dados, ou seja, dividi a carga de dados em vários partes para não sobrecarregar.


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    terça-feira, 19 de maio de 2009 17:45
    Moderador
  • mas...
    como você fez isso?
    no select?

    Glaudson -- The Apprentice --
    terça-feira, 19 de maio de 2009 18:46
  • Glaudson,

    Em cada OleDBSource eu utilizei um Select específico, algo do tipo:

    Select * from Produtos
    Where Codigo Between 1000 And 10000

    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    terça-feira, 19 de maio de 2009 18:51
    Moderador
  • entendi...
    eu vou tentar fazer algo assim para ver se vai funcionar.
    Depois eu posto aqui.
    Valeu!
    Glaudson -- The Apprentice --
    terça-feira, 19 de maio de 2009 19:56
  • Junio,

    ainda não tive sucesso com o problema.
    Eu descobri que se definir restrição de memória no componente LookUp, os dados serão processados de pouco em pouco... eliminando assim a minha suspeita inicial de que o erro dava por que tinha que armazenar muitos dados na memória. O que faz todo sentido... a mensagem de 'cached' era do componente LookUp e não do OleDbSource.
    Mas ainda assim persiste o erro:

    "SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x8004D01C.
    An OLE DB record is available. Source: "IBM OLE DB Provider for DB2" Hresult: 0x8004D01C Description: " SQL30081N A communication error has been detected. Communication protocol being used: "TCP/IP". Communication API being used: "SOCKETS". Location where the error was detected: "172.16.3.203". Communication function detecting the error: "recv". Protocol specific error code(s): "10060", "*", "*". SQLSTATE=08001
    "

    aff...
    Ainda estou tentando... se tiver mais alguma sugestão eu agradeço.
    Valeu.

    Att.
    Glaudson Silva
    Glaudson -- The Apprentice --
    • Marcado como Resposta Glaudson segunda-feira, 29 de junho de 2009 18:30
    • Não Marcado como Resposta Glaudson segunda-feira, 29 de junho de 2009 18:30
    segunda-feira, 8 de junho de 2009 12:31
  • Junio,

    desculpe a demora para dar um retorno...
    acabou que o problema ainda não foi resolvido... mas depois de tanto penar em testes... descobrimos que o problema não é aqui... (affffffffffffff).
    Está com algum problema no servidor dos dados... o pessoal de lá ainda não sabe exatamente o que é, estamos aguardando.
    E eu descobri que se você especificar restrição de memória no LookUp, o OleDbSource não busca todos os dados para a memória... (o que eu achei, inicialmente, que fosse o problema),  e sim busca-os de acordo com a memória definida.

    Agora eu tenho que aguardar...
    obrigado pela ajuda!


    Glaudson -- The Apprentice --
    • Marcado como Resposta Glaudson segunda-feira, 29 de junho de 2009 18:30
    segunda-feira, 29 de junho de 2009 18:30
  • Glaudson,

    Neste momento não tenho sugestões, somente fazer esta análise e limitar a quantidade de memória.


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    segunda-feira, 29 de junho de 2009 19:46
    Moderador