1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

Urgente Agilizar consulta For Each

Discussão em 'Progress 4GL' iniciado por brunohrds27, Julho 29, 2014.

  1. brunohrds27

    brunohrds27 Sem Pontuação

    Olá pessoal,

    Sou iniciante de programação em progress.
    Gostaria de fazer um pequeno relatório de produtividade do EMS Datasul modulo WMS.
    Fiz esta consulta porem esta levando muito tempo.
    Gostaria pedir a ajuda de vocês para melhorar o código abaixo e se tiverem um pouquinho mais de paciência me passar as melhores praticas.
    Muito Obrigado.

    Código:
       FOR EACH wm-docto NO-LOCK
                         WHERE  wm-docto.dt-implan-docto >= DATE(Data-Inicial)
                         AND  wm-docto.dt-implan-docto <= DATE(Data-Final)                  
                         AND  wm-docto.cod-estabel ="053"
                         AND  wm-docto.cod-local = "NTO"
                         AND  wm-docto.ind-origem-docto = ori-doc
                         AND  wm-docto.ind-tipo-trans = 2.
                       
                        
        
                  FOR EACH  wm-docto-itens NO-LOCK
                     WHERE  wm-docto-itens.id-docto  = wm-docto.id-docto.
    
                FOR EACH  wm-tarefa-docto-itens NO-LOCK
                   WHERE  wm-tarefa-docto-itens.id-docto  = wm-docto-itens.id-docto
                     AND  wm-tarefa-docto-itens.cod-tarefa = 7
                     AND  wm-tarefa-docto-itens.num-seq-item = wm-docto-itens.num-seq-item.
    
    disp 
  2. jaisonantoniazzi

    jaisonantoniazzi Membro Ativo

    Olá @brunohrds27 , tudo bom?
    1. Tentar usar um índice conforme a tua pesquisa e pensar nos campos a serem usados, o progress tem algoritmo para localizar o melhor índice, mas você pode ajudar.
    2. Não colocar funções na cláusula where, com exceção da ROWID, pois algumas funções poderão ser resolvidas somente no lado cliente, a date que você está usando é uma delas.
    3. Na cláusula where usar somente campos de índice.
    4. Tentar usar mais igualdade do que maior e menor com igual.
    5. Os campos que não são índices e deverão filtrar os registros deverão ir para dentro do for each e você deverá usar next para serem ignorados, em testes você poderá confirmar se é o melhor ou não.
    6. Usar cláusulas FIELDS para limitar a quantidade de campos trazidos durante a pesquisa.
    7. Não fazer cláusulas malucas para facilitar o desenvolvimento, normalmente as instruções mais simples são mais performáticas pois não quebram os índices e os campos usados naqueles.
    No demais, é testar testar e testar, até ajustar a melhor pesquisa conforme a tua necessidade.
    Forte abraço.
    Jaison Antoniazzi
    skype:jaison.antoniazzi
    email:jaison.antoniazzi@gmail.com
    brunohrds27 curtiu isso.
  3. Eilleen

    Eilleen Membro Ativo

    Boa tarde,

    Você precisa analisar se existem índices que atendem essas buscas, é isso que vai fazer sua busca ter uma melhor performance...
    Sobre escolha de índices, postei algumas dicas nesse tópico:

    http://www.4each.com.br/threads/como-usar-índices.7846/

    Espero que ajude! ;)
    brunohrds27 curtiu isso.
  4. brunohrds27

    brunohrds27 Sem Pontuação

  5. brunohrds27

    brunohrds27 Sem Pontuação

    Olá pessoal,
    Obrigado pelas dicas ajudou no desempenho.
    Porem por ser iniciante, não entendi isto “Os campos que não são índices e deverão filtrar os registros deverão ir para dentro do for each e você deverá usar next para serem ignorados" você poderia dar um exemplo, por favor.

    Quanto ao NO-LOCK é bom colocar no final do field ou no final do for each?

    Focou assim até o momento:

    Código:
       FOR EACH  wm-docto fields(cod-estabel cod-local id-docto num-docto nr-pedcli nr-embarque dt-implan-docto ind-sit-docto ind-origem-docto ind-tipo-trans) NO-LOCK
                       WHERE  wm-docto.cod-estabel ="053"
                         AND  wm-docto.cod-local = "NTO"
                         AND  wm-docto.dt-implan-docto >= DATE(Data-Inicial)
                         AND  wm-docto.dt-implan-docto <= DATE(Data-Final)
                         AND  wm-docto.ind-origem-docto = ori-doc
                         AND  wm-docto.ind-tipo-trans = 2.
    
    
                FOR EACH  wm-tarefa-docto-itens fields(id-docto  num-seq-item cod-tarefa ind-status-tarefa-itens cod-usuario dt-fim-tarefa dt-inicio-tarefa hr-fim-tarefa hr-inicio-tarefa) NO-LOCK
                   WHERE  wm-tarefa-docto-itens.id-docto  = wm-docto.id-docto
                     AND  wm-tarefa-docto-itens.cod-tarefa = 7.
                 
     
               FOR EACH wm-docto-itens fields(id-docto num-seq-item cod-item  qtd-item  cod-tarefa) NO-LOCK
                 WHERE wm-docto-itens.cod-estabel = wm-docto.cod-estabel
                   AND wm-docto-itens.cod-local   = wm-docto.cod-local
                   AND wm-docto-itens.id-docto    = wm-docto.id-docto
                   AND wm-docto-itens.num-seq-item = wm-tarefa-docto-itens.num-seq-item. 
  6. jeffyssantos

    jeffyssantos Membro Participativo

    Opa...blza brunohrds27 !
    Aqui com certeza o seu nível de conhecimento vai aumentar tem muita dica e, pessoas com conhecimento dispostas ajudar !
    Sobre performance, tomei a liberdade de anexar um material que tinha aqui sobre este assunto, talvez esteja um pouco desatualizado mas, com certeza vai te ajudar neste início.

    Uma dica, que dou no exemplo, seria usar first, each of

    for each wm-docto
    where .........
    no-lock,
    each wm-docto-itens of wm-docto
    where ....
    no-lock,
    end.

    Ahhh me passa o teu e-mail (se quiser é claro) que te envio um material que tenho sobre performance, tentei anexar aqui mas, pelo tamanho do arquivo ou coisa parecida dá erro...

    Bons estudos e boa sorte.

    Sds,
    Jefferson
    brunohrds27 curtiu isso.

Compartilhe esta Página