Olá Márcio,

Os motivos que me ocorrem são:

1. EXCESSO de índices: tornam a gravação mais lenta, apesar de não ser meu 
palpite, pois você precisaria ter uns 20 índices muito mal escolhidos nessa 
tabela para isso começar a ficar aparente. Para tirar a dúvida, descarte um 
ou dois índices cheios de campos e veja se faz uma grande diferença. Se não 
fizer, nem esquente e recoloque-os;

2. Excesso de raise NOTICES: com vários registros, o número de linhas 
geradas no resultado fica grande muito rápido, talvez esse tráfego possa 
atrapalhar o desempenho. Tire os RAISE NOTICE ou faça um a cada 1000 
registros para ver se há diferença. Se não melhorar, deixe-os lá mesmo;

3. FALTA de índices: vejo que há várias tabelas com FK no nome e que 
aparentemente você está incluindo registros na tabela "pai" e depois nas 
"filhas". Certifique-se de que todas as suas tabelas têm índices para PKs e 
FKs e que esses ORDER BY são de fato esseciais (caso sejam tente por índices 
para eles);

4. Você verificou se essas funções de geram código de barras têm desempenho 
constante? Suponho que sim, mas, sem o fonte é necessário verificar se elas 
não andam gravando coisas em lugares inesperados ou se não têm alguma falha 
de programação (memory leak) e isso causa a perda gradativa de desempenho;

4. Memória menor do que as tabelas ou aproveitamento inadequado do buffer: 
Se essas tabelas forem enormes, vai compensar bastante preencher uma de cada 
vez. Troque esse monte de loops um dentro do outro por um que só preencha a 
tb_extracoes_bilhetes, depois outro loop que preencha só a 
tb_extracoes_bilhetes_fracoes e depois outro que só de inserts na 
tb_extracoes_bilhetes_numeros. Via de regra vários loops seguidos (mesmo com 
reprocessamento dos mesmos dados) são muito melhores que um loop grandão 
feito o seu;

5. Transação grande demais: se usar valores muito grandes para 
arg_bilhetes_a_gerar, o servidor vai sofrer para fazer toda essa 
parafernália numa só transação, especialmente se chegar perto do limite do 
tamanho de transação do postgres sem ultrapassá-lo (não é difícil chegar 
perto ou tropeçar nesse limite infame com uma tabela grande). Usar números 
pequenos demais é um desastre, porém caso não tenha procurado vale a pena 
pesquisar valores maiores ou menores que os que você andou usando.

Quando resolver, ficarei curioso em saber o que foi.

Atenciosamente,

Mozart Hasse 


_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Reply via email to