Query planner: EXPLAIN ANALYZE ninja
⏱ 15 min·⭐ 65 XP
Pré-requisitos (0/1)0%
- ⬜🔀 MVCC e isolation levels de verdade (sem simplificação)(Database Deep — Postgres Internals)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
Anatomia de um plano
EXPLAIN ANALYZE BUFFERS
SELECT u.name, COUNT(o.id)
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE u.created_at > '2026-01-01'
GROUP BY u.id
ORDER BY COUNT(o.id) DESC
LIMIT 10;
-- Output:
-- Limit (cost=X rows=10 ... actual time=1.2..2.3 rows=10 ...)
-- -> Sort (...)
-- -> HashAggregate (...)
-- -> Hash Left Join (...)
-- -> Seq Scan on users u (... Filter: created_at > ...)
-- Rows Removed by Filter: 500
-- -> Hash (...)
-- -> Seq Scan on orders o (...)O que procurar
| Sinal no plano | O que significa | O que fazer |
|---|---|---|
| Estimativa muito distante do real | Estatísticas desatualizadas ou correlação entre colunas | Atualizar estatísticas; considerar estatística estendida |
| Varredura sequencial em tabela grande | Sem índice usável, ou o planejador julgou mais barato | Conferir se o filtro casa com a esquerda de algum índice |
| Junção por laço aninhado com muitas linhas | Estimativa baixa levou à estratégia errada | Corrigir a estimativa; forçar plano é último recurso |
| Ordenação em disco | Memória de trabalho insuficiente | Aumentar a memória da sessão, ou indexar para evitar a ordenação |
| Filtro aplicado DEPOIS da leitura | O índice trouxe linhas demais | Índice composto ou parcial |
| ⚠ Custo alto e tempo baixo | Custo é estimativa, não medida | Comparar sempre com o tempo real |
Sinal no planoEstimativa muito distante do real
O que significaEstatísticas desatualizadas ou correlação entre colunas
O que fazerAtualizar estatísticas; considerar estatística estendida
Sinal no planoVarredura sequencial em tabela grande
O que significaSem índice usável, ou o planejador julgou mais barato
O que fazerConferir se o filtro casa com a esquerda de algum índice
Sinal no planoJunção por laço aninhado com muitas linhas
O que significaEstimativa baixa levou à estratégia errada
O que fazerCorrigir a estimativa; forçar plano é último recurso
Sinal no planoOrdenação em disco
O que significaMemória de trabalho insuficiente
O que fazerAumentar a memória da sessão, ou indexar para evitar a ordenação
Sinal no planoFiltro aplicado DEPOIS da leitura
O que significaO índice trouxe linhas demais
O que fazerÍndice composto ou parcial
Sinal no plano⚠ Custo alto e tempo baixo
O que significaCusto é estimativa, não medida
O que fazerComparar sempre com o tempo real
- cost=X..Y: custo estimado (startup..total). Planner minimiza total.
- rows=N: estimativa vs actual. Divergência 10x+ = stats desatualizadas → ANALYZE.
- actual time: tempo real (ms). Preste atenção em nós com tempo alto.
- Buffers: shared hit/read: hit = cache, read = disk. Read alto = baixa cache locality.
- Rows Removed by Filter: se alto, predicate não usa índice — candidate a index.
- Sort Method: external merge: spilled pra disk (work_mem baixo) — aumenta ou adicione índice que evite sort.
Quiz rápido
Qual comparação, no plano de execução, aponta a causa raiz de um plano ruim?
Stats desatualizadas
-- Rows estimadas vs actual divergiu 100x?
-- Auto-analyze não rodou ou está atrás.
ANALYZE users; -- atualiza stats
-- Config autovacuum mais agressivo por tabela quente
ALTER TABLE users SET (autovacuum_analyze_scale_factor = 0.01);
-- Distribution de valor pode precisar stats maiores
ALTER TABLE users ALTER COLUMN country SET STATISTICS 1000; -- default 100
ANALYZE users;💡
Query lenta + estimado-vs-actual muito diferente = 70% das vezes. Antes de criar índice, rode ANALYZE. Muitas vezes resolve sem mudar schema.
Perguntas frequentes
❓ Como o planejador escolhe o plano?
Comparando custo estimado de alternativas, com base em estatística de distribuição das colunas. Ele não mede: estima. Por isso estatística velha é a causa mais comum de plano ruim, e é o primeiro suspeito quando linhas estimadas e reais divergem por ordens de magnitude.
❓ Quando forçar o plano é aceitável?
Quase nunca como solução, às vezes como diagnóstico: desabilitar um tipo de junção temporariamente mostra o que o planejador estava evitando. Como remédio permanente, ele congela a decisão e envelhece mal, porque o volume de dado muda e o plano fixo deixa de ser o melhor.
❓ O que fazer quando a estimativa está muito errada?
Atualizar estatística, aumentar o alvo de amostragem na coluna problemática e, quando há correlação entre colunas, criar estatística estendida — o planejador assume independência por padrão, e correlação é a causa clássica de subestimar linhas.
Fixando
Quiz rápido
Quando um nó de junção por laço aninhado é sinal de problema?
Quiz rápido
Qual ação corrige a maior parte dos planos ruins causados por estatística?
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…