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?
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....
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.
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. ...
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