problema de desempenho PostgreSQL

votos
4

Eu posso ver nos logs do PostgreSQL que certas consultas simples (sem junta e usando apenas corresponder a condições que usam índices) levar de 1 a 3 segundos para executar. Eu consultas que levam mais de um segundo para executar, portanto, há consultas semelhantes que executam menos de um segundo, que não são reportados log.

Quando tento a mesma consulta usando EXPLAIN ANALYZE, que leva alguns milissegundos.

A tabela contém cerca de 8 milhões de discos e é escrito para e consultado extensivamente. Tenho habilitado vácuo auto e até recentemente (há poucas horas) correu um VACUUM ANALYZE nessa tabela.

Amostra entrada de log consulta: Dec 30 10:14:57 postgres DB01 [7400]: [20-1] LOG: Duração: 3857,322 declaração ms: SELECT * FROM respostas Onde ( respostas .contest_id = 17469) e (user_id não é dezembro 30 10:14:57 postgres DB01 [7400]: [20-2] nulo) POR ORDEM updated_on desc LIMITE 5

contest_id e user_id é indexado. updated_on não é indexado. Se eu indexá-lo, o planejador de consultas ignora a ans índice contest_id usa updated_on vez que ainda retarda a consulta. As entradas máximas na consulta acima, sem o limite não seria mais do que 1000.

Qualquer ajuda seria muito apreciada.

Publicado 30/12/2008 em 05:58
fonte usuário
Em outras línguas...                            


5 respostas

votos
3

Mais alguns detalhes pode ser útil aqui, dependendo se você pode ou não fornecê-los. Mais útil seria a saída real do seu EXPLAIN ANALYZE, para que possamos ver o que ele faz para completar a consulta. A definição da tabela sendo consultada pode ser útil também, juntamente com os índices. Quanto mais informações, melhor. Só posso especular agora sobre o que está acontecendo, aqui estão algumas facadas cegos:

  • Um monte de outras SELECTs estão acontecendo nesse banco de dados, ao mesmo tempo, e periodicamente os dados e / ou resultado está expirando de algum esconderijo em algum lugar.
  • Há outra coisa que bloqueia periodicamente esta tabela para cima de 3-4 segundos antes de soltá-lo novamente, período em que esta consulta é preso
  • Esta tabela é escrito para tão amplamente que as estatísticas da tabela acabam quase nunca refletir a realidade, e como tal o analisador de consulta botches a decisão sobre se deve ou não usar o índice (es) para executar a consulta.

Outras pessoas podem ter outras idéias, mas sim. Mais informações sobre o que está acontecendo pode ser útil.

Respondeu 30/12/2008 em 06:24
fonte usuário

votos
0

Isso parece estar acontecendo devido a trocar.

Respondeu 07/01/2009 em 13:00
fonte usuário

votos
0

pgsql-performance é uma grande lista de discussão para pedir esses tipos de perguntas.

Parece que você tem dois problemas aqui:

1) Você quer ser capaz de indexar updated_on, mas se o fizer, PostgreSQL escolhe o plano errado.

Meu primeiro palpite seria que o PostgreSQL está superestimando o número de tuplas que correspondem o predicado " (responses.contest_id = 17469) AND (user_id is not null)". Se postgres utiliza esse predicado primeiro, ele deve depois classificar os valores para implementar o ORDER BY. Você diz que ele corresponda 1000 tuplas; Se o PostgreSQL pensa que corresponde 100000, talvez ele pensa digitalização, a fim usando o índice updated_on será mais barato. Outro fator pode ser a sua configuração: se work_memestiver definido baixo, pode pensar que a classificação é mais caro do que é.

Você realmente precisa para mostrar o EXPLAIN ANALYZE saída de uma consulta lenta, de modo que podemos ver por que ele pode ser a escolha de um índice digitalizar na updated_on.

2) Mesmo se ele não está indexado, às vezes leva um tempo para executar, mas você não sabe por que, porque se você executá-lo manualmente ele funciona bem.

Use o auto_explainmódulo contrib, novo, com 8,4. Ele permite que você para registrar a EXPLAIN ANALYZEsaída de consultas que levam muito tempo. Apenas registrando a consulta coloca você no exatamente o problema que você tem agora: cada vez que você executar a consulta é rápido.

Respondeu 03/09/2009 em 17:21
fonte usuário

votos
0

se exatamente a mesma consulta leva milisegundos em explicar analisar e 3 segundos em logs (ie i assumir que ele passa a demorar 3 segundos, não cada chamada para que demora tanto tempo) - que definitivamente significa que ele está travando questão.

Respondeu 03/09/2009 em 17:37
fonte usuário

votos
0
  • travamento
  • troca
  • CLUSTER / VACUUM FULL no trabalho cron
  • rede saturada
  • saturada IO

verifique iostat, vmstat, iptraf ...

Respondeu 30/10/2009 em 17:19
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more