Fernando,
 
> Segue a Relação Solicitada.
> - Sistema Operacional = Windows 2003 Server
> - Versão PostgreSQL = 8.2
> - Configurações PostgreSQL (postgresql.conf) - Segue anexo
> - Estruturas de Dados utilizadas (tabelas, indices, etc) Segue anexo
> - Procedimentos envolvidos (pls, rotinas, etc). Segue anexo
> Obrigado.
> Fernando Gesse.

Meus palpites:
- Há um loop dentro do outro trabalhando registro a registro. O ideal seria
agrupar os UPDATEs para ter menos comandos executados. Procure ordenar ou dar
um GROUP BY no cursor de produtos. Em 400 registros como você estimou, aposto
que há produtos e operações repetidas que poderiam ser montados num UPDATE
só;
- Há montagem de SQL dinâmica. Os IFs que montam isso não são tão
complicados, sugiro que troque tudo por comandos SQL fixos. O código talvez
aumente (pelo que vi não muito), mas o Postgres não perderá tempo montado
strings e recompilando centenas de vezes comandos bem parecidos. É pouco
provável que resolva, mas com certeza ajuda;
- Para cada tabela que sobre insert, tente montar um SELECT com todos os
registros a inserir (sim, unindo todos os casos, tipos de operação e regras
de negócio) e faça a inserção fora dos loops usando um INSERT INTO SELECT.
Isso poupará um tempo considerável e tornará seu código muito mais
simples;
- Pondere bem se você precisa REALMENTE de dois loops um dentro do outro. Se
possível coloque um UPDATE por tabela, somando ou subtraindo tudo o que é
necessário de uma só vez;
- com menos comandos e uma lógica mais orientada a conjuntos, pode ser
possível identificar quais comandos geram teu gargalo e aí otimizar mais
este processo.

Atenciosamente,

Mozart Hasse


_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a