[Pular para o conteúdo principal](#main-content)

[![Logo Bendev](/images/logo-branco.png)](/)

-   [Trabalhos](/projetos)
-   [Sobre](/sobre)
-   [Escrita](/blog)
-   [Imprensa](/entrevistas)
-   [Contato](/contato)

PTENES

[PostgreSQL](/blog/tag/postgresql)[SQL](/blog/tag/sql)

# Como ler EXPLAIN ANALYZE no PostgreSQL para investigar uma consulta lenta

[![Bendev Junior](/images/bendev.jpg)Bendev Junior](/sobre)Publicado em 13 de novembro de 2026 às 09:00 GMT-41 min de leitura[Ver Web Story 9:16](/stories/postgresql-explain-analyze-consulta-lenta)

![Como ler EXPLAIN ANALYZE no PostgreSQL para investigar uma consulta lenta](/images/blog-covers/postgresql-explain-analyze-consulta-lenta.svg)

Uma consulta ficou lenta quando a tabela cresceu. Rode EXPLAIN (ANALYZE, BUFFERS) com filtros representativos em um ambiente seguro para observar o plano executado. Compare o número estimado de linhas com as linhas observadas e veja quantas vezes cada operação se repetiu.

```sql
EXPLAIN (ANALYZE, BUFFERS)
SELECT id, created_at
FROM orders
WHERE customer_id = 42
ORDER BY created_at DESC
LIMIT 20;
```

## Leia o volume de trabalho

Em um nó executado várias vezes, actual rows e actual time são médias por execução. Olhe loops para entender o trabalho acumulado. Os tempos de nós pais incluem trabalho dos filhos, portanto somar todos os tempos distorce o total.

Um Seq Scan pode ser razoável quando a consulta lê boa parte da tabela. Para esse exemplo, compare o plano antes e depois de testar um índice que comece por customer\_id e considere created\_at. Meça com dados e seletividade parecidos com os reais. EXPLAIN ANALYZE executa a instrução. Para uma escrita, comece com EXPLAIN sem ANALYZE se só precisa ver a estimativa.

[Documentação de referência](https://www.postgresql.org/docs/current/using-explain.html) · [Como esperar o PostgreSQL ficar pronto no Docker Compose](/blog/docker-compose-healthcheck-postgres)

## Cuidado com dados e custos do plano

EXPLAIN ANALYZE executa o comando para medir o plano. A consulta do exemplo é somente leitura, mas o cuidado é importante para UPDATE, DELETE e comandos com efeitos colaterais. Para inspecionar uma escrita, use uma transação de teste e faça rollback quando isso for seguro. EXPLAIN sem ANALYZE não executa, mas suas estimativas dependem das estatísticas disponíveis.

BUFFERS ajuda a distinguir leituras do cache compartilhado de leituras no armazenamento. Um grande número de buffers não prova sozinho que um índice falta; compare com linhas retornadas, seletividade, custo de manter o índice e consultas de escrita afetadas. O plano também pode mudar conforme os valores dos parâmetros. Para consultas preparadas, compare estimativas genéricas e específicas conforme o comportamento da versão do PostgreSQL.

## Atualize estatísticas e meça de novo

As estimativas de cardinalidade dependem de estatísticas coletadas pelo banco. Depois de uma carga grande, verifique se elas representam os dados atuais. Um índice composto ajuda quando a ordem e a combinação dos filtros correspondem ao padrão consultado. Um índice usado para uma query de teste pequena pode não ser escolhido para uma tabela maior porque o otimizador calcula outro custo.

Compare o plano original com uma alteração por vez e mantenha dados representativos. Registre a consulta, os parâmetros, a configuração e a versão do banco. Para produção, prefira uma ferramenta de acompanhamento de consultas lentas que agregue eventos com cuidado; não copie valores sensíveis dos parâmetros para relatórios públicos.

Uma otimização precisa ser comparada sob condições equivalentes. Execute a consulta com parâmetros e volume semelhantes, observe cache frio e aquecido quando isso fizer diferença e não use um único tempo como garantia. Um plano com menos custo estimado pode ser mais lento no cenário real. Guarde o plano antes e depois da mudança e inclua o caso em que há poucos resultados e outro em que o filtro seleciona uma fração maior da tabela.

## Leia também

Mais artigos sobre o tema.

-   [Paginação SQL por cursor ou OFFSET?Ler artigo](/blog/sql-paginacao-cursor-offset)
-   [Como esperar o PostgreSQL ficar pronto no Docker ComposeLer artigo](/blog/docker-compose-healthcheck-postgres)
-   [Arquitetura hexagonal em Go para uma API de despesas familiaresLer artigo](/blog/arquitetura-hexagonal-go-despesas-familiares)

[Abrir Web Story](/stories/postgresql-explain-analyze-consulta-lenta)[Ver todos os artigos](/blog)[Projetos](/projetos)[Livros](/livros)[Sobre Bendev](/sobre)

![Bendev Junior](/images/bendev.jpg)

Bendev Junior

Tech Lead e Arquiteto de Software.

[Voltar ao blog](/blog)

![Logo Bendev](/images/logo-branco.png)

© 2026 Bendev Junior. Todos os direitos reservados.

### Links Rápidos

-   [Trabalhos](/projetos)
-   [Sobre](/sobre)
-   [Escrita](/blog)
    -   [Livros](/livros)
-   [Imprensa](/entrevistas)
-   [Contato](/contato)

### Redes Sociais

[LinkedIn de Bendev Junior](https://linkedin.com/in/bendevjunior)[GitHub de Bendev Junior](https://github.com/bendevjunior)[Instagram de Bendev Junior](https://instagram.com/bendevoficial)
