for each lento sem o no-lock

Discussão em 'Progress 4GL' iniciado por avicioli, Setembro 15, 2011.

  1. avicioli

    avicioli Sem Pontuação

    Ao fazer um for each em uma determinada tabela sem usar o no-lock com intenção de alterar um campo do registro dessa tabela, observei que o programa ficou muito lento, comparado ao for each com uso de no-lock.
    Existe outra saida para que o for each sem o no-lock mantenha o mesmo padrão do for each com no-lock?
  2. kirchner

    kirchner Membro Participativo Moderador

    avicioli,

    Você está conectando em um banco remoto? Caso sim, existe uma questão arquitetural do protocolo de rede do Progress que impede um desempenho bom sem o no-lock.
    Se o banco é local, você pode usar conexão de shared memory. Daí a diferença de tempo é bem pequena. Remotamente não tenho sugestões....
  3. avicioli

    avicioli Sem Pontuação

    O banco é remoto. Por isso conseguimos perceber que há uma grande diferença entre usar o for each {tabela} no-lock com o for each {tabela}.
    Obrigado pela mensagem.
  4. eduardo.leite

    eduardo.leite Equipe de Suporte Moderador Equipe de Suporte

    Bom,

    Existem várias coisas que podemos fazer para melhorar a perfomance, vai depender da sua necessidade, mas vai algumas dicas:

    01) Procurar usar o FIELDS logo após o FOR EACH assim, você irá trazer para o desktop somente os campos que irá utilizar, por exemplo, você está lendo a tabela item e deseja alterar somente o campo descrição:

    Código:
    
    for each item fields (it-codigo ge-codigo dsc-item)
        where item.ge-codigo = 00 exclusive-lock:
    
    ...
    
    
    02) Outra maneira seria, além do citado acima, fazer a leitura com NO-LOCK e dentro do for each fazer a leitura do registro em uma tabela buffer somente para aqueles que for feito a alteração

    Código:
    
    def buffer bf-item for item.
    
    for each item fields (it-codigo ge-codigo dsc-item)
        where item.ge-codigo = 00 no-lock:
    
       if item.fm-codigo = "teste" then do:
    
            find first bf-item where bf-item.it-codigo = item.it-codigo exclusive-lock no-error.
    
    ...
    
    
  5. atila.cm

    atila.cm Membro Participativo

    Caro avicioli:

    Quando passei por um problema semelhante, a alternativa que usei foi reduzir o tamanho da transação. Note bem, em um FOR EACH sem o NO-LOCK, todos os registros lidos fazem parte da transação, portanto todos serão armazenados para caso de um ROLLBACK. Se você fizer "FOR EACH <tabela> ... TRANSACTON:" apenas o laço será armazenado, e não todo o FOR EACH. Depende da lógica do seu programa, no meu caso resolveu.

    Espero ter lhe ajudado.

    Abraços

    Atila

Compartilhe esta Página