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

[RESOLVIDO] [RESOLVIDO] - Lentidao For each

Discussão em 'EMS , HCM e Totvs 11' iniciado por Rsacoman, Setembro 11, 2014.

Status do Tópico:
Não esta aberto para novas mensagens.
  1. Rsacoman

    Rsacoman Sem Pontuação

    Galera bom dia,
    estou com um programa específico para fazer manutençao, porem o for each está muito grande.
    E com isso o processamento acaba perdendo a performace.

    Gostaria de alguma idéia:
    segue o código.


    FOR EACH pedido-compr NO-LOCK USE-INDEX data-pedido
    WHERE pedido-compr.data-pedido >= dt-emissaop_ini
    AND pedido-compr.data-pedido <= dt-emissaop_fim
    AND pedido-compr.num-pedido >= i-pedido_ini
    AND pedido-compr.num-pedido <= i-pedido_fim,
    EACH ordem-compra NO-LOCK USE-INDEX pedido
    WHERE ordem-compra.num-pedido = pedido-compr.num-pedido
    AND ordem-compra.cod-estabel >= c-estabelecimento_ini
    AND ordem-compra.cod-estabel <= c-estabelecimento_fim
    AND ordem-compra.data-emissao >= dt-emissaoo_ini
    AND ordem-compra.data-emissao <= dt-emissaoo_fim
    AND ordem-compra.requisitante >= c-requisitante_ini
    AND ordem-compra.requisitante <= c-requisitante_fim
    AND ordem-compra.numero-ordem >= i-ordem_ini
    AND ordem-compra.numero-ordem <= i-ordem_fim
    /*AND ordem-compra.cod-comprado >= c-comprador_ini
    AND ordem-compra.cod-comprado <= c-comprador_fim */
    AND ordem-compra.it-codigo >= c-item_ini
    AND ordem-compra.it-codigo <= c-item_fim
    AND (ordem-compra.situacao = i-confirmadas
    OR ordem-compra.situacao = i-nao_confirmadas
    OR ordem-compra.situacao = i-cotadas
    OR ordem-compra.situacao = i-emcotacao
    OR ordem-compra.situacao = i-recebidas) ,
    EACH emitente NO-LOCK
    WHERE emitente.cod-emitente = ordem-compra.cod-emitente
    AND emitente.nome-abrev >= c-nome_abreviado_ini
    AND emitente.nome-abrev <= c-nome_abreviado_fim,
    EACH prazo-compra NO-LOCK USE-INDEX ordem
    WHERE prazo-compra.numero-ordem = ordem-compra.numero-ordem
    AND prazo-compra.data-entrega >= dt-entrega_ini
    AND prazo-compra.data-entrega <= dt-entrega_fim,
    EACH item NO-LOCK
    WHERE item.it-codigo = ordem-compra.it-codigo
    AND ITEM.fm-codigo >= c-familia_ini
    AND ITEM.fm-codigo <= c-familia_fim
    AND item.ge-codigo >= tt-param.i-grupo-ini
    AND item.ge-codigo <= tt-param.i-grupo-fim,
    each doc-pend-aprov USE-INDEX doc-pend-aprov-9 no-lock
    where doc-pend-aprov.ind-tip-doc >= 4
    AND doc-pend-aprov.ind-tip-doc <= 6
    AND doc-pend-aprov.num-pedido = pedido-compr.num-pedido
    AND doc-pend-aprov.cod-aprov >= c-aprovador_ini
    AND doc-pend-aprov.cod-aprov <= c-aprovador_fim
    BY pedido-compr.num-pedido:

    Segue os Indices:
    Tab: pedido-compra
    data-pedido 9 2 + data-pedido
    + num-pedido
    Tab: prazo-compra
    pu ordem 9 2 + numero-ordem
    + parcela

    Tab: ordem-compra:
    pedido 9 2 + num-pedido
    + numero-ordem

    Tab: doc-pend-aprov
    doc-pend-aprov-9 11 3 + ind-tip-doc
    + num-pedido
    + cod-aprov
    Última edição: Setembro 11, 2014
  2. manfredini

    manfredini Sem Pontuação

    Alguns detalhes: o uso do >= <=, modifique a lógica e use > < no lugar. O uso de OR com use-index, evita qualquer otimização de query que por ventura o Progress faria.
  3. marco.luques

    marco.luques Membro Ativo

    Aconselho você a fazer for each apenas com campos indexados

    os outros campos utilizar case ou if para filtrar.

    fica bem mais rápido.
  4. eduardo.leite

    eduardo.leite Equipe de Suporte Moderador Equipe de Suporte

    Caro colega,

    Como dito acima, quando usar o use-index, procure colocar no where somente os campos do indice e evite usar >= e <= nestes campos do indice, em alguns casos, é melhor deixar o proprio progress (ele consegue fazer isso) escolher o indice adequado para o where.

    Fiz um exemplo, baseado na sua lógica e aqui executou sem problema, além de não usar o use-index (fui testando tabela a tabela) voce colocou a leitura do doc-pend-aprov dentro do "for each" e este foi o principal vilao da historia, pois como voce usou o >= e <= para o primeiro campo da chave e usou o BY para classificar, primeiramente ele vai ler toda a base e jogar para a memoria, para depois classificar e só entao disparar para a tela o resultado.

    Veja no exemplo que estou te enviando que tirei do "for each" o doc-pend-aprov e coloquei fora, desta maneira a execução é imediata.

    Faça um teste e retornar se melhorou para você, espero ter ajudado.

    Arquivos Anexados:

  5. Rsacoman

    Rsacoman Sem Pontuação

    Nooooooooooossa!!!!
    Era isso mesmo!
    Eduardo ficou fera!

    Ficou rapidão hem!

    Obrigado pela dica.

    Forte abraço!
Status do Tópico:
Não esta aberto para novas mensagens.

Compartilhe esta Página