Vendo desempenho de consulta que não é satisfatório em nossa aplicação Python, que executa diversos processos que utilizamos SQLAlchemy core
para acessar um banco de dados PostgreSQL 9.2. Podemos ter cerca de 100-200 ou mais processos simultâneos executando consultas no banco de dados .
Não temos sistemas de pooling de conexão como pgpoolII
ou pgbounce
atualmente instalados.
Testei uma consulta que pode levar de 1 a 10 segundos de nosso aplicativo, que quando executada psql
leva no máximo 20 ms .
Acreditamos que esse problema esteja relacionado a conexões simultâneas, principalmente por causa do comportamento descrito acima e porque vemos esses problemas de desempenho ao acessar tabelas diferentes no sistema. No entanto, não temos certeza disso e poderíamos aceitar prontamente sugestões ou soluções alternativas.
Qual é a maneira usual de lidar com conexões simultâneas de vários processos em um único servidor de banco de dados, de forma a permitir que as consultas sejam executadas rapidamente?
Você meio que responde à sua própria pergunta quando diz que não tem pooling, mas ...
Esta não é uma resposta pronta para uso, com todas as coisas do cliente/db, você pode precisar fazer algum trabalho para determinar exatamente o que está errado
backup postgresql.conf mudando
Pare e reinicie seu servidor de banco de dados (recarregar pode não captar as alterações) Reproduza seus testes garantindo que o horário do servidor e o horário do cliente correspondam e que você registre os horários de início, etc.
copie o arquivo de log de uma importação para o editor de sua escolha (excel ou outra planilha pode ser útil para obter manipulação avançada para sql e planos, etc.)
agora examine os tempos do lado do servidor e observe:
o sql informado no servidor é o mesmo em cada caso
se for o mesmo, você deve ter os mesmos horários
é o cliente gerando um cursor em vez de passar sql
é a consulta que chega no servidor quando você acredita que deveria
é um driver que faz muitos castings/conversões entre conjuntos de caracteres ou conversões implícitas de outros tipos, como datas ou timestamps.
e assim por diante
Os dados do plano serão incluídos para completude, podendo informar se há diferenças grosseiras no SQL enviado pelos clientes.