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

Duvida Escolha automatica de índices pelo Progress

Discussão em 'Progress 4GL' iniciado por ds201, Junho 26, 2015.

  1. ds201

    ds201 Membro Participativo

    Bom dia

    Estou com uma dúvida:
    - Como ter certeza sobre quais índices estão sendo usados (ou melhor: foram escolhidos pelo Progress) no programa abaixo?

    - Se eu escolher (via use-index) um índice para "saldo-estoq" isto pode prejudicar a ligação da tabela "item" com a tabela "saldo-estoq"? Minha preocupação neste caso é performance.

    São aquelas coisas que usamos ao longo de anos e um dia bate a dúvida...

    find item
    where item.it-codigo = "B060-g"
    no-lock.

    for each saldo-estoq of item
    where saldo-estoq.cod-refer = ""
    no-lock:

    display
    saldo-estoq.it-codigo
    saldo-estoq.qtidade-atu.
    end.


    Obrigado
    reissobr curtiu isso.
  2. ds201

    ds201 Membro Participativo

    Provavelmente o índice usado em "saldo-estoq" esta errado. Ainda estou tentando achar um índice melhor.
    Eu já uso a tabela "ord-prod" neste programa). Creio que vai ficar assim:

    find ord-prod
    where ord-prod.nr-ord-produ = int(tt-dados-char.e-op-destino)

    use-index codigo

    no-lock.


    find item
    where item.it-codigo = ord-prod.it-codigo
    no-lock.


    /*--- Lê saldo-estoq ---*/
    for each saldo-estoq
    where saldo-estoq.cod-estabel = ord-prod.cod-estabel and

    saldo-estoq.cod-depos = ord-prod.cod-depos and

    saldo-estoq.it-codigo = ord-prod.it-codigo and

    saldo-estoq.cod-refer = ""

    use-index dt-vali-lote
    no-lock:

    ...
    end.

  3. joelscampos

    joelscampos Membro Participativo

    Não sei se é uma boa prática, mas prefiro usar o use-index porque fica mais explícito.
    Além disso, existem índices descending em que o first dele é o last de um descending.

    Exemplo:
    Código:
    DEF TEMP-TABLE tt NO-UNDO
        FIELD nr        AS INT
        INDEX idx-a nr
        INDEX idx-b nr DESCENDING.
    
    CREATE tt.
    ASSIGN tt.nr    = 1.
    
    
    CREATE tt.
    ASSIGN tt.nr    = 2.
    
    CREATE tt.
    ASSIGN tt.nr    = 3.
    
    FIND FIRST tt NO-ERROR.
    MESSAGE tt.nr VIEW-AS ALERT-BOX.
    
    
    FIND FIRST tt USE-INDEX idx-b NO-ERROR.
    MESSAGE tt.nr VIEW-AS ALERT-BOX.

    Para descobrir o índice é escolhido, da para usar:


    Código:
    ASSIGN
        LOG-MANAGER:LOGFILE-NAME    = "c:\spool\trace.log"
        LOG-MANAGER:LOG-ENTRY-TYPES = "4GLMessages,4GLTrace,4GLTrans,QryInfo,DB.*,DS.*,DynObjects.*,FileID,IgnoredOps,ProEvents.*,SAX"
        LOG-MANAGER:LOGGING-LEVEL   = 4 /* 4 (Extended)  */.
    LOG-MANAGER:CLEAR-LOG().
    
    
    find item
        where item.it-codigo = "B060-g"
        no-lock.
    
    for each saldo-estoq of item
        where saldo-estoq.cod-refer = ""
        no-lock:
    
        display
            saldo-estoq.it-codigo
            saldo-estoq.qtidade-atu.
    end.
    
    
    LOG-MANAGER:CLOSE-LOG().

    Para melhorar a performance, o FIELDS() ajuda bastante.
    Também não confio no uso do OF. Já tive problema com o uso dele em temp-tables.


    Não conheço esta tabelas aí, mas acho os campos no where precisam ficar na sequência certinha do índice também.
  4. ds201

    ds201 Membro Participativo

    Muito obrigado por responder.
  5. lhp.s

    lhp.s Membro Participativo

    Depois de conversar com um colega de trabalho e analisar os código pelo ABHack,
    adotei a não usar o use-index ( a não ser em casos específicos).
    Sempre usar fields().
    Sempre usar IGUAL na primeira cláusula.
    Usar break-by apenas qdo necessário.
    Em caso de data, qdo possível, criar um repeat data = today to xxxx
  6. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    mas isso é metodologia antiga pra ganho de performance mesmo, vamos supor que vc quer ler todas as notas fiscais de uma faixa de estabelecimentos e clientes, muito mais rapido vc fazer ....
    Código:
        define variable dataTemp as date no-undo.
        for each estabelecimento no-lock
            where estabelecimento.cod-estabel >= codEstabelInicial
              and estabelecimento.cod-estabel <= codEstabelFinal:
       
            for each emitente no-lock
                where emitente.cod-emitente >= codEmitenteInicial
                  and emitente.cod-emitente <= codEmitenteFinal:
       
       
                repeat dataTemp = dataInicial to dataFinal:
                    for each nota-fiscal no-lock
                        where nota-fiscal.cod-estabel = estabelecimento.cod-estabel
                          and nota-fiscal.cod-emitente = emitente.cod-emitente
                          and nota-fiscal.dt-emis-nota = dataTemp:
    
                    end.
                end.
            end.
        end.
    
    ao inves de fazer ....
    Código:
        for each nota-fiscal no-lock
            where nota-fiscal.cod-estabel  >= codEstabelInicial
              and nota-fiscal.cod-estabel  <= codEstabelFinal
              and nota-fiscal.cod-emitente >= codEmitenteInicial
              and nota-fiscal.cod-emitente <= codEmitenteFinal
              and nota-fiscal.dt-emis-nota >= dataInicial
              and nota-fiscal.dt-emis-nota <= dataFinal:
        end.
    
    Quanto menos o progress PENSAR, mais rapido fica.

Compartilhe esta Página