4

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":

  1. log_min_duration_statement = 0 em dev e contar queries por tela.
  2. EXPLAIN (ANALYZE, BUFFERS) nas 3 telas mais acessadas.
  3. Índice só onde o EXPLAIN mostra Seq Scan em tabela grande.
  4. 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

Carregando publicação patrocinada...
1