2009/10/29 Mozart Hasse <mozart.ha...@usa.net>:
>
> Deparei-me com uma trigger em Postgres que para um determinado caso está
> horrivelmente lenta. O cenário é o seguinte: temos uma tabela de
> lançamentos, com uso pesado e simultâneo, que atualiza via trigger uma
> tabela de saldos, usando trigger functions do tipo ON EACH ROW, que determinam
> a diferença de valores entre o OLD e o NEW para saber o que atualizar na
> tabela de saldos.

Um dos motivos por que eu prefiro não usar tabelas cujos dados são
resultados de cálculos de outras tabelas. Prefiro usar VIEWs.

> O problema é que a tabela tem 130000 registros e o cliente agora resolveu
> mandar várias atualizações com média de 3000 registros de uma vez, o que
> para um trigger do tipo ON EACH ROW está sendo um desastre.

Não me parece tanto assim. Aqui vão algumas perguntas:

1) Quão complexos são esses cálculos?

2) Quantas consultas em outras tabelas tem que ser feitas nesses cálculos?

3) Já passaste essas consultas por seus devidos EXPLAIN para analisar
como elas estão sendo planejadas?

4) Como está a sua work_mem e parâmetros relacionados de memória? Como
estão seus parâmetros de checkpoints? Será que o PG não está gastando
muito tempo fazendo checkpoints, ou tendo pouca memória para
trabalhar?

5) Como é a sua configuração de disco? Logs estão em discos separados?
Tabelas mais usadas, como essa de saldo, estão em tablespaces
separados?

> O SQL Server tem um modo de indicar o que foi modificado através das tabelas
> virtuais 'inserted' e 'deleted', por isso a mesma rotina em SQL Server
> (ceteris paribus) exclui os 3000 registros e executa via trigger os
> recálculos necessários em 5 ou 6 segundos, enquanto que o Postgres leva
> *horas* (mais de 10, não tivemos paciência de cronometrar) recalculando
> registro a registro com o ON EACH ROW.

Tem algo errado aí. Será que isso é um caso da aplicação estar sendo
desenvolvida (e otimizada) no SQL Server e portada sem o mesmo cuidado
para PG?

Se os cálculos são complexos e tem que ser feitos ANTES dos resultados
serem enviados ao disco e transação COMMITted, como pode o SQL Server
fazer em 5 segundos? Se o SQL Server estiver apenas criando as tabelas
"virtuais" e retornando controle ao usuário, para depois executar a
checagem e escrita em disco usando as tabelas virtuais, então o
comportamento está errado, de acordo com o que você disse que não pode
acontecer abaixo (usando uma tabela separada)

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

Responder a