1. Sintoma de query lenta
Dashboard lento, CPU alta no Postgres, locks. Antes de “subir a máquina”, meça a query.
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM pedidos
WHERE cliente_id = 42 AND status = 'aberto'
ORDER BY created_at DESC
LIMIT 20;
2. O que olhar no EXPLAIN
- Seq Scan em tabela grande — candidato a índice
- Index Scan / Bitmap — bom sinal se seletivo
- Rows estimado vs real — estatísticas desatualizadas?
- Buffers — muita leitura de disco
3. Índices úteis
-- composto na ordem do filtro + ordenação
CREATE INDEX ON pedidos (cliente_id, status, created_at DESC);
-- parcial
CREATE INDEX ON pedidos (created_at)
WHERE status = 'aberto';
DICA Índice demais atrasa writes. Crie com base em query real, não em “talvez um dia”.
4. Armadilhas
- Função na coluna impede uso de índice:
WHERE LOWER(email) = ...→ índice em expressão ou coluna normalizada SELECT *carrega colunas desnecessárias- OFFSET alto em paginação — prefira keyset pagination
5. Checklist
ANALYZEapós cargas grandes- Índices alinhados a filtros reais
- Monitorar
pg_stat_statements - Vacuum/autovacuum saudável