none
Melhorar o desempenho de execução RRS feed

  • Pergunta

  • Boa tarde pessoal,

    Estou utilizando o SSIS para integrar o MS Dynamics CRM com um outro sistema ERP .

    Criei um pacote para integrar Contratos do sistema ERP para o Dynamics, estou utilizando uma massa de dados

    somente de 6.600 registros, mas está demorando muito para transferir as informações, da última vez que executei para criar

    6.600 registros levou em torno de 40 minutos , muito tempo.

     

    Estou montando o Fluxo utilizando a seguinte estrutura:

    1-Criei uma conexão com o banco (Origem do ADO NET ) para filtrar e converter as informações na Query, pelo visto a minha query não tem nenhum problema, pois está levando menos de meio segundo para ser executada.

    2-Criei uma pesquisa para verificar no MS Dynamics CRM quais registros preciso levar e quais devo ignorar(Estou trabalhando nesse caso somente com inclusão)

    3-Fiz outras pesquisas para buscar ID's de registros filtrados na query

    4-Classifiquei utilizando o componente de Classificação e uni todas as Colunas utilizando o 'Junção de Colunas' para me retornar todas as colunas que preciso utilizar.

    5-Estou utilizando o Componente Script e o Web Reference(CrmService ) do Dynamics para incluir os registros utilizando o método Create .

    Só como observação, também estou criando os Itens do Contrato , ou seja, estou executando somente de vez em quando o Create para incluir o cabeçalho, pois no começo do Script eu utilizo o RetrieveMultiple() para verificar se o registro já existe, caso já exista eu pego o ID para incluir novos itens.

     

    Todo este processo está demorando muito para ser executado, não sei o que pode estar errado.

    Será que é porque estou chamando o WebService do Dynamics linha a linha do Fluxo?

    Gostaria da ajuda de vocês, preciso de um auxílio.

     

    Obrigado desde já!

    segunda-feira, 13 de setembro de 2010 19:12

Respostas

  • Então, só pra não ter dúvidas no Control Flow vc pode ter quantos Data Flows forem necessários. Através das Constraints (as setas que vc arrasta verde/vermelha/azul) e que vão dizer qual a precedência da execução do seu pacote.

    No seu caso, ficará assim:

    1 - Control Flow

    1.1 - Data Flow Task transferir todos os Contratos;

    1.1.1 - Dentro dele as operações que nós já discutimos;

    Conectar a seta verde que indica que o próximo passo será executado apenas se o passo atual for concluído com sucesso do Data Flow Task 1.1 ao Data Flow Task 1.2

    1.2 - Data Flow Task transferir todas as Linhas do Contrato;

    1.1.2 - Dentro deste Data Flow incluir os tratamentos para este caso

    Foi essa a idéia.


    Wyllian de Lima - Se a resposta ajudou vote como útil !
    • Marcado como Resposta Klibor quarta-feira, 15 de setembro de 2010 14:22
    quarta-feira, 15 de setembro de 2010 14:21

Todas as Respostas

  • Bem o fato de fazer um "Loop" pra verificar se determinado ID deve estar deixando sua carga mais lenta sim. Acho que esse era o motivo de um post seu anterior onde eu sugeri a utilização do Slowly Changing Dimension, dê uma olhada naquele link.

    Para vc comparar de imediato siga estes passos:

    - Inclua o componente no seu Data Flow o SCD no lugar do Script Component e apague o seu Destination;

    - Abra o SCD, verifique se a Conexão é a de DESTINO e escolha a tabela de DESTINO;

    - Quando for selecionado sua tabela de DESTINO indique como Business Key o ID da sua tabela e selecione Not Key Column para o restante e Next;

    - Para todos os atributos que forem listados na próxima etapa selecione a opção Changing Attribute e clique em next até finalizar o assistente.

    Deverá aparecer o SCD e abaixo dele um Destination com indicando insert e um OLDB Command que vai fazer a atualização. Acho que isso vai resolver o problema.
    Wyllian de Lima - Se a resposta ajudou vote como útil !
    terça-feira, 14 de setembro de 2010 12:16
  • Olá Wyllian, tudo bom?

     

    Segui o seu conselho do post anterior, mas não consegui prosseguir com a utilização do SCD devido alguns campos que eu criei não estarem na entidade [dbo].[ContractBase], pelo que ví, meus campos customizados ficam em uma outra tabela, na [dbo].[ContractExtensionBase], sendo assim não consigo ter acesso ao mesmo tempo nos campos customizados(que contém um Business Key) e nem o restante dos campos padrões do Dynamics.

    Como posso fazer nesse caso?

     

    terça-feira, 14 de setembro de 2010 14:59
  • Não entendi, qual a tabela que vc precisa carregar? [dbo].[ContractBase] ou [dbo].[ContractExtensionBase]?

    O que eu vejo com a utilização do SCD é um Data Flow assim:

     

    - OLEDB/ADO Source (Com a sua query)

    - Slowly Changing Dimension (Vc não vai precisar da Lookup pois ele já vai verificar o que tem, o que não tem e o que tem de ser atualizado)

    - O SCD criará um OLEB Destination para insert e um OLDB Command para o Update.

    Obs: Se vc precisar fazer joins com outras tabelas sugiro que faça via query, somente se for necessário fazer com o Merge Join ou Merge isso interfere em questões de performance etc.

    Aguardo retorno, abraço !


    Wyllian de Lima - Se a resposta ajudou vote como útil !
    quarta-feira, 15 de setembro de 2010 12:15
  • Olá Wyllian, desculpe, eu não fui bem claro.

     

    Na verdade eu tenho a seguinte situação:

    Eu possuo uma massa de dados em um sistema ERP e preciso mandar esses dados para Contrato e Itens do Contrato no Dynamics.

    De ínicio, estou tentando gravar somente o cabeçalho(entidade Contrato).

    Os registros provenientes desse outro sistema até então não tinha nenhuma amarração com algum campo da Entidade Contrato no Dynamics, aí eu tive que criar um campo que serviria como chave(no meu caso eu fiz Código do Cliente + Código do Produto , pois estou gerando os Contratos separados por Cliente e Produto ).

     

    Depois que você me aconselhou a usar o SCD eu tentei o seguinte:

    1 - Criei um ORIGEM OLEDB com a minha query.

    2 - Criei o SCD apontando para a entidade [dbo ].[ContractBase ]

    Neste passo, eu ví que o campo chave(Cliente + Produto ) que eu tinha criado, não estava na lista de campos dessa entidade. Aí eu escolhi [dbo ].[ContractExtensionBase ] e ví que o campo estava lá(Nessa entidade o SCD só me retornou 2 campos, ContractId e o campo chave que eu criei). O que acontece é que eu não vou poder atualizar o campo chave neste mesmo SCD que eu apontei para a entidade [dbo ].[ContractBase ].

    Nesse caso, só para teste, escolhi a entidade [dbo ].[ContractBase ] e coloquei como Business Key o Título do Contrato (que guarda a informação Contrato + Nome do Cliente + Nome do Produto ).

    3 - Coloquei o restante dos atributos como Not Key Column e depois coloquei todos como Atributo de Alteração e conclui o assistente.

    4 - O SCD gerou um OLEDB Destination e um OLEDB Command de UPDATE filtrando somente os registros não deletados (Alterei o OLEDB Command para dar UPDATE somente se o registro não estiver deletado), mas executando o pacote, de 6000 registros no Fluxo, o SCD não envia nenhuma linha para Inserção, não entendi o porquê.

    Será que é porque o SCD considera também os registros deletados? Ele verifica que já existe e que não teve nenhuma modificação e não faz nada?

    OBS: Não sei se influencia em algo, mas no Dynamics já tinha alguns dados que eu havia mandado aí eu exclui para testar a inclusão pelo SCD .

     

    quarta-feira, 15 de setembro de 2010 12:55
  • Ah sim, espero que vc entenda que é complicado entender de cara qual o seu cenário mas já dá pra imaginar o que e como está sendo feito.

    Bem esse comportamento e normal no caso de vc não ter visto as linhas de inserção (6.000 e não foi nenhuma), esse passo do Data Flow só é executado se não existe o registro para aquela Business Key, ou seja, se a Busness Key não existe. O mesmo vale para o passo que atualiza os dados.

    Se esta tabela estiver vazia ou se a origem enviar algum dado novo ao SCD ele direciona para Insert/Update e vc vai ver a qtde de linhas que passaram por lá !

    Pelo que entendi vc tem que manipular então 2 tabelas distintas, será que tem a possibilidade de tratar isso em 2 Data Flows diferentes?

    Em um vc faz os tratamentos na entidade [dbo ].[ContractBase ], e no seguinte vc trata a entidade [dbo ].[ContractExtensionBase ] !?

    Ou vc poderia pensar em criar um Data Flow e trazendo da Origem os dados das duas tabelas através de um Join e armazenar em uma tabela temporária (ou uma tabela auxiliar, ou seja, toda vez que o pacote rodar vc trunca essa tabela e recarrega) e cria um novo Dataflow para carregar seu destino com o SCD !?

     


    Wyllian de Lima - Se a resposta ajudou vote como útil !
    quarta-feira, 15 de setembro de 2010 13:28
  • É meio complicado mesmo, ainda mais que eu sou novato, nunca tinha mexido nessa ferramenta antes. Não conheço todos os componentes.

    Huum, agora eu acho que estou começando a entender.

     

    De fato, os registros existem, estão deletados, mas existem e o SCD considerou isso, por isso não enviou nenhuma linha para inserção. (Eu confundi coisas distintas, o SCD vai sempre considerar o que tem no BANCO)

    A não ser que tenha uma forma de fazer um filtro para não considerar determinado valor em uma coluna ?!.(UM WHERE )

    Por exemplo: "Where DeletionStateCode = '0' " (O Dynamics armazena 0 para os não deletados).

    Aí o SCD iria verificar somente nos registros não deletados, se existe algum novo ou algum modificado.

     

    Sim, estou trabalhando com duas tabelas distintas, mas no caso seria:

    1- Entidade Contrato(Contract )

    2- Entidade Linhas do Contrato(ContractDetail )

     

    O que eu relatei foi que o campo novo que eu criei não aparece no SCD quando eu aponto para a entidade [dbo ].[ContractBase ], só aparece quando eu aponto para o [dbo ].[ContractExtensionBase ] que é a tabela de extensão, onde ficam todos os campos criados pelo usuário.

     

    Mas isso eu acho que não é um problema, pois no DESTINO OLEDB eu consigo incluir essa coluna através de consulta e mapear um valor a ela.

     

    Tem como eu chamar um Data Flow através de outro? Por exemplo, agora que você falou, pensei em fazer mais ou menos assim:

    Primeiro crio um Data Flow que irá transferir todos os Contratos e a partir dele eu chamo um novo Data Flow que irá transferir todas as Linhas do Contrato.

    quarta-feira, 15 de setembro de 2010 13:49
  • Achei sua idéia bacana, acho que dá pra fazer uns testes mas .... ... você não consegue incluir um Data Flow dentro do outro!

    Porém vc poderia incluir uma Data Flow Task no seu Control Flow arrastar a constraint do primeiro passo (Primeiro crio um Data Flow que irá transferir todos os Contratos) para esse novo Data Flow (chamo um novo Data Flow que irá transferir todas as Linhas do Contrato) que será executado apenas quando o primeiro tiver sucesso.

    Estamos encontrando uma solução veja se essa atende as necessidades, aguardo retorno.


    Wyllian de Lima - Se a resposta ajudou vote como útil !
    quarta-feira, 15 de setembro de 2010 13:59
  • Huum, entendi.

    Então por Data Flow Task eu consigo chamar outro Data Flow Task. blz

     

    [Mas como que eu imponho essa restrição? para ser executado apenas quando o primeiro passo tiver sucesso?]

    Já descobri, rsrs.. só bastava clicar na linha do fluxo entre os Data Flows.

     

    Outra pergunta, dá fazer com que o SCD considere somente os registros que eu quiser?(Queria colocar a filtragem na coluna DeletionStateCode)

     

    Eu ví que o SCD tem uma propriedade(SqlQuery) e lá ele usa um SELECT para a pesquisa, tentei alterar manualmente colocando no fim da query um Where [DeletionStateCode] = '0', mas ele dá erro no componente quando eu executo.

    quarta-feira, 15 de setembro de 2010 14:05
  • Então, só pra não ter dúvidas no Control Flow vc pode ter quantos Data Flows forem necessários. Através das Constraints (as setas que vc arrasta verde/vermelha/azul) e que vão dizer qual a precedência da execução do seu pacote.

    No seu caso, ficará assim:

    1 - Control Flow

    1.1 - Data Flow Task transferir todos os Contratos;

    1.1.1 - Dentro dele as operações que nós já discutimos;

    Conectar a seta verde que indica que o próximo passo será executado apenas se o passo atual for concluído com sucesso do Data Flow Task 1.1 ao Data Flow Task 1.2

    1.2 - Data Flow Task transferir todas as Linhas do Contrato;

    1.1.2 - Dentro deste Data Flow incluir os tratamentos para este caso

    Foi essa a idéia.


    Wyllian de Lima - Se a resposta ajudou vote como útil !
    • Marcado como Resposta Klibor quarta-feira, 15 de setembro de 2010 14:22
    quarta-feira, 15 de setembro de 2010 14:21
  • Blz Wyllian, irei agora acertar o primeiro Data Flow, em seguida irei criar o segundo.

     

    Postarei novamente assim que terminar estes passos!

     

    Não é possível fazer aquilo que falei no SCD, para considerar apenas os registros que não estejam deletados(DeletionStateCode = '0')?

     

    Obrigado pelas dicas e pela paciência em me ajudar.

     

    [Editado]:

    Wyllian, estou tendo dificuldades em usar o SCD para incluir os dados no Dynamics, pois, alguns campos não tem como eu passar um valor, por exemplo, o campo ContractId eu não vou conseguir passar um valor de um GUID pra ele.

    Como que eu faço nessa situação?

    quarta-feira, 15 de setembro de 2010 14:24
  • Cara eu não entendi, mas pelo pouco que compreendi eu digo que todas colunas que são chaves (PK) são business key mesmo que tenha mais que uma (composta) também são.

     

    Qualquer coisa estou á disposição


    Wyllian de Lima - Se a resposta ajudou vote como útil !
    quarta-feira, 15 de setembro de 2010 19:51