Olá Dutra,

Obrigado pela resposta. Seguem comentários.

Em 12 de novembro de 2011 12:14, Leandro Guimarães Faria Corcete DUTRA <
l...@dutras.org> escreveu:

> Le 2011-N-12  11h38, Eduardo Santos a écrit :
>
>
>> Estava com alguns problemas de lock
>>
>
> Que problemas?  Normalmente, a questão não é versão mas programação do
> aplicativo…


É um problema que até a versão 8.1 gerava deadlock no PostgreSQL: uma
função PL/pgSQL, chamada em uma transação, que chama uma outra função
PL/pgSQL em outra transação. Um ciclo de 5 ou 6 funções chamadas dentro de
transações. O problema maior não é esse, contudo. A questão é que a
sequência de funções pode ser chamada várias vezes dentro da aplicação.
Assim, enquanto a tabela está sendo chamada por uma consulta, ela está
travada pela transação. No meio disso tudo, existe uma outra chamada para a
transação, que só vai ser executada após a primeira trava ser liberada.

Difícil de explicar dada a complexidade da chamada, mas o fato é que temos
muitos locks em sequência da mesa linha na mesma tabela. Como essa é a
parte que mais evoluiu, achei quem um upgrade ia me ajudar.

Sim, o aplicativo poderia realizar uma chamada mais atômica de uma única
função PL/pgSQL e resolver o problema, mas estou adiando isso até não ter
mais jeito. O trabalho de reescrita seria simplesmente construir o sistema
novamente, e não posso me dar a esse luxo enquanto o sistema está lento
para os usuários.



>
>  decidi atualizar minha versão do PostgreSQL da 8.2 para a 8.4
>>
>
> Por que para uma versão tão antiga?  Já estamos na 9.1, que avançou bem
> mais em relação à 8.4 que a 8.4 em relação à 8.2.
>
>
Problemas de retro-compatibilidade que ainda não tive tempo de resolver.
Como removeram as cláusulas add_missing_from e regex_flavour na versão 9.0,
ainda não posso atualizar. Também é algo que pode ser resolvido, com tempo
que ainda não tenho. A ideia era resolver após o sistema ficar mais rápido.


>
>  Contudo, para minha surpresa, a performance caiu drasticamente. O
>> curioso é que as máquinas físicas são idênticas fisicamente e mantive
>> exatamente os mesmos parâmetros de configuração para o PostgreSQL.
>>
>
> Essas não são as únicas variáveis.  Só de cabeça, sem gastar muito
> fosfato, vêm sistema operacional, sistemas de arquivos e configuração dos
> mesmos; e coleta de estatísticas.
>

Essa é a questão: as máquinas são fisicamente iguais, com os mesmos
softwares instalados e mesmas configurações de SO. Fiz questão de checar
duas vezes para garantir um ambiente replicado. Até o disco é o mesmo.



>        Como os planos de execução foram bem diferentes, eu apostaria em
> diferenças ou na estrutura dos dados; ou no texto da consulta; ou na massa
> de dados; ou na configuração do PostgreSQL ou na coleta de estatísticas,
> todos pontos a verificar urgentemente, e informar aqui.
>
>
Essa foi a ideia que eu tive. Me parece que houve muitas mudanças no
otimizados. Consegui achar duas referências:

http://postgresql.1045698.n5.nabble.com/query-taking-much-longer-since-Postgres-8-4-upgrade-td3787736.html
http://postgresql.1045698.n5.nabble.com/A-query-become-very-slow-after-upgrade-from-8-1-10-to-8-4-5-td3246107.html

Nenhuma das duas foi conclusiva, contudo. O fato é que o otimizador escolhe
um nested loop com um semi join na versão do 8.4, enquanto no 8.1 a opção
escolhida é primeiro ordenar utilizando um bitmap heap scan. Infelizmente
meus conhecimentos de otimização do otimizador (desculpe o pleonasmo) não
me permitiram resolver o problema ainda. Alguma ajuda com dicas de
configuração seria bem-vinda.

Mais uma vez, obrigado pela resposta em pleno Sabadão! :)


-- 
Eduardo Santos
Analista de Sistemas

http://eduardosan.wordpress.com
http://twitter.com/eduardosan
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a