Marcio Cunha

PostgreSQL lento? Como usar EXPLAIN ANALYZE na prática

Descubra como identificar consultas lentas no PostgreSQL usando o comando EXPLAIN ANALYZE para eliminar full table scans e otimizar índices.

Marcio Cunha•3 min
Também disponível em:EnglishEspañol
Resumo
  • O comando EXPLAIN ANALYZE executa a consulta real enquanto revela o plano de execução escolhido pelo otimizador.
  • A presença de um Sequential Scan em tabelas grandes é um sinal claro de que a consulta está lendo dados desnecessariamente.
  • Índices parciais reduzem drasticamente o uso de memória e o tempo de busca ao filtrar apenas subconjuntos relevantes da tabela.
  • A leitura do plano permite identificar custos de CPU e IOPS antes que eles se tornem gargalos fatais em produção.
  • O uso estratégico de filtros no índice evita que o banco de dados carregue páginas mortas ou irrelevantes para a memória RAM.

O que acontece quando o PostgreSQL busca seus dados?

Quando você executa uma consulta SQL, o banco de dados não simplesmente 'sabe' onde os dados estão. Ele precisa tomar decisões sobre como ler as tabelas. O plano de execução é, literalmente, o mapa de rota que o PostgreSQL traça para buscar suas informações. Quando o banco de dados está lento, geralmente é porque ele escolheu uma rota ineficiente, percorrendo milhares de registros sem necessidade.

Entendendo o plano de execução com EXPLAIN ANALYZE

Para visualizar esse plano, utilizamos o comando EXPLAIN ANALYZE. Ao prefixar sua consulta com este comando, o banco executa o SQL e retorna um relatório detalhado. É importante notar que ele mostra tanto o custo estimado quanto o tempo real gasto. Por exemplo, ao rodar EXPLAIN ANALYZE SELECT * FROM pedidos WHERE status = 'pendente';, o PostgreSQL revelará se ele está fazendo um Seq Scan (leitura completa da tabela) ou um Index Scan (busca otimizada). Aprender a ler esses resultados é a base para acelerar consultas no PostgreSQL de forma estruturada.

Identificando o vilão: Sequential Scan em tabelas grandes

O Sequential Scan, ou 'varredura sequencial', acontece quando o banco de dados percorre cada linha de uma tabela para encontrar o que você pediu. Em uma tabela com poucos registros, isso é rápido. Mas em tabelas com milhões de linhas, é um desastre de performance. Se o seu EXPLAIN ANALYZE indica um Seq Scan em uma tabela grande, isso quase sempre significa que faltam índices apropriados. Às vezes, o problema pode até escalar para gargalos que impedem a transação de seguir, caso você não esteja monitorando o banco conforme sugerido em nosso guia sobre locks e deadlocks.

A solução: quando aplicar índices parciais

Nem sempre você precisa indexar toda a coluna. Se você filtra frequentemente por status = 'ativo', não faz sentido criar um índice que inclua os milhões de registros 'inativos' ou 'cancelados'. O índice parcial é um recurso poderoso onde você define uma cláusula WHERE no próprio índice. Isso mantém o índice pequeno, rápido de ler e consome muito menos RAM. Na prática, isso significa uma busca quase instantânea porque o PostgreSQL ignora todo o 'ruído' que não faz parte da sua condição de busca.

Como criar e validar seu índice parcial

A sintaxe é simples e direta. Vamos ver um exemplo para uma tabela de logs onde apenas os erros importam para a performance imediata:

CREATE INDEX idx_logs_erro_parcial ON logs (criado_em) WHERE status = 'erro';

Após criar o índice, execute novamente o EXPLAIN ANALYZE. Você notará que o plano de execução mudou de um Seq Scan para um Index Scan ou Bitmap Index Scan. Esse pequeno ajuste é um dos passos mais importantes para evitar que o pool de conexões do PostgreSQL fique saturado por consultas que demoram demais para processar.

Considerações finais

Otimizar consultas não é um processo de tentativa e erro, mas uma ciência de observação. Ao usar o EXPLAIN ANALYZE, você deixa de adivinhar o motivo da lentidão e passa a enxergar exatamente onde o banco de dados está gastando recursos. Comece sempre analisando as consultas mais frequentes e de maior volume.

Lembre-se que um índice bem planejado resolve 90% dos casos de lentidão. Com a prática, você desenvolverá o 'olhar clínico' para identificar gargalos em segundos, garantindo que sua aplicação permaneça escalável mesmo sob carga pesada.