Antes de pedir mais servidor, rode EXPLAIN ANALYZE
Peguei um sistema em que uma tela levava 14 segundos pra carregar. O reflexo do time era o de sempre: "falta servidor, bota mais RAM". Só que a CPU do banco estava em 12%. Servidor entediado não é problema de servidor.
Liguei o log de queries no ambiente de desenvolvimento e a mesma tela disparava mais de 1.200 consultas pra montar uma única página. É o clássico N+1: o código lista N registros e, pra cada um, faz mais uma ida ao banco buscar um relacionamento.
Como eu confirmo isso rápido, sem ferramenta paga.
No Postgres dá pra ver o plano real de uma query com:
EXPLAIN (ANALYZE, BUFFERS) SELECT ...;
Se aparecer Seq Scan numa tabela grande onde você esperava um Index Scan, achou o gargalo. O ANALYZE executa a query de verdade e mostra o tempo real; o BUFFERS mostra quanto foi lido do disco.
Pra pegar o N+1 sem adivinhação, ligue o log de tudo (em dev, nunca em prod):
ALTER SYSTEM SET log_min_duration_statement = 0;
SELECT pg_reload_conf();
Agora abra a tela e conte as linhas do log. 50 itens virando 100+ queries é a assinatura do problema.
O que resolveu no meu caso foi um índice que faltava numa coluna de data muito filtrada:
CREATE INDEX CONCURRENTLY idx_pedidos_criado_em ON pedidos (criado_em);
O CONCURRENTLY cria o índice sem travar a tabela em produção (demora mais, mas não bloqueia escrita). A query que levava 9 segundos passou a responder em 40ms.
Um aviso honesto: índice não é de graça. Cada índice deixa INSERT/UPDATE um pouco mais lentos e ocupa disco. Crie onde a busca dói e meça com o EXPLAIN antes e depois — não saia indexando tudo.
O checklist que virou hábito meu antes de qualquer "precisa escalar":
log_min_duration_statement = 0em dev e contar queries por tela.EXPLAIN (ANALYZE, BUFFERS)nas 3 telas mais acessadas.- Índice só onde o EXPLAIN mostra Seq Scan em tabela grande.
- Testar com volume de produção, não com seed de 200 linhas.
Na maioria das vezes o problema nunca foi o servidor. Foi o código conversando errado com o banco.
Versão completa no blog: https://revin.com.br/pt/blog/o-banco-que-so-fica-lento-quando-o-produto-da-certo