Função matches muito lenta

Discussão em 'Progress 4GL' iniciado por DFResmer, Maio 3, 2013.

  1. DFResmer

    DFResmer Membro Participativo

    Olá galera!
    Criei um programa para gerar uma consiliação contábil, mas tenho que ler os históricos dos lançamentos e achar o código do fornecedor neles, a função que fiz abaixo funciona perfeitamente com o matches, mas ainda acho q está muito lento, poderia ser um pouco mais rápido, coloque o campo TABCTB.complemento como chave, mas não mudou nada na velocidade, alguém tem alguma ideia?

    Código:
         FOR EACH TABCTB WHERE TABCTB.nr_lote    = TABCTB_LOTE.nr_lote AND
                               TABCTB.cd_empresa = TABCTB_LOTE.cd_empresa EXCLUSIVE-LOCK.
    
                  FOR EACH TTCAD.
                      IF TABCTB.complemento matches ("*" + STRING(TTCAD.cd_cadastro) + '-' + SUBSTRING(STRING(TTCAD.fantasia),1,5) + "*") THEN DO:
                         ASSIGN TABCTB.codfor      = TTCAD.cd_cadastro
                                TABCTB.cd_contabil = TTCAD.cd_contabil.
                      END.   
                  END.
      END.
    
  2. Mokwa

    Mokwa Membro Participativo

    Tenta cria um indice word-index para esse campo: TABCTB.complemento e veja se melhora.
  3. joelscampos

    joelscampos Membro Participativo

    Outra tentativa, também, seria:
    Código:
    FOR EACH TABCTB WHERE TABCTB.nr_lote    = TABCTB_LOTE.nr_lote AND
                               TABCTB.cd_empresa = TABCTB_LOTE.cd_empresa EXCLUSIVE-LOCK.
    
                  FOR EACH TTCAD.
                      IF INDEX(TABCTB.complemento, STRING(TTCAD.cd_cadastro) + '-' + SUBSTRING(STRING(TTCAD.fantasia),1,5)) > 0 THEN DO:
                         ASSIGN TABCTB.codfor      = TTCAD.cd_cadastro
                                TABCTB.cd_contabil = TTCAD.cd_contabil.
                      END.   
                  END.
     END.
    
    É bom rodar sem o matches, só para ter certeza que é ele que deixou lento, pois derrepente é o for each sem fields, ou o índice...
  4. jalegria

    jalegria Membro Participativo

    Para esse tipo de pesquisa utilize sempre begins (no seu caso não dá) ou contains (word-index como foi citado).
    O matches não vai utilizar indice, ou mesmo se utilizar terá de varrer a tabela inteira, só é indicado se a tabela não for tão grande.
  5. Agnaldo

    Agnaldo Membro Ativo

    O problema ali não é o matches, pois ele "não" esta sendo usado no for each.
  6. jalegria

    jalegria Membro Participativo

    Sim, mas mesmo assim ele sempre está varrendo a tabela ttcad inteira para cada passagem do primeiro foreach, o que no frigir dos ovos dá no mesmo.
    Vai ser a qtde de registros do 1º foreach X a qtde do 2º, e dependendo das qtdes envolvidas vai ficar lento mesmo.

    Acho que daria para colocar um word-index, como foi sugerido por outro colega, nesse campo complemento e pesquisar diretamente os registros, o que iria dar uma otimizada, é claro que estou dizendo tudo isto supondo como é a estrutura na qual ele está trabalhando, e não apresentando um solução para o caso.

    Ele faria somente um for each na ttcad (que talvez seja uma temp-table) e pesquisaria os registros devidos na tabctb, e pronto. Novamente supondo que ele possa incluir esse indice, pois se não puder mexer na estrutura do DB, aí são outros 500.

Compartilhe esta Página