Pular para o conteúdo

Consultas N+1: o vilão silencioso da API lenta

A tela de pedidos faz uma consulta para a lista e mais uma para cada pedido. Com 200 itens, são 201 idas ao banco. Veja como identificar e eliminar o problema N+1.

Por Equipe We Codex3 min de leitura

A rota funcionava bem com 10 pedidos no ambiente de teste. Em produção, com 300, demora quatro segundos. O código parece inocente — e é exatamente por isso que o problema N+1 é tão comum.

Como ele aparece

ts
const pedidos = await db.pedido.findMany()
for (const p of pedidos) {
  p.cliente = await db.cliente.findUnique({ where: { id: p.clienteId } })
}

Uma consulta para a lista (1) e uma para cada item (N). Cada ida ao banco custa poucos milissegundos — multiplicados por centenas, viram segundos.

Como corrigir

ts
const pedidos = await db.pedido.findMany({ include: { cliente: true } })

Como descobrir

Ative o log de consultas em desenvolvimento e conte quantas uma rota dispara. Ferramentas de observabilidade em produção mostram o mesmo padrão: dezenas de consultas idênticas em sequência (Observabilidade para quem não é SRE: métricas, logs e traces).

Os parentes do N+1

Mesmo com uma consulta só, a rota pode estar lenta por falta de índice (Índices no banco de dados: a otimização mais barata que você ainda não fez) ou por trazer dados demais sem paginação (Paginação por cursor vs. offset: quando a lista começa a ficar lenta).

A We Codex otimiza backends lentos em sistemas web e Performance WPO. Fale com a gente.

  • Banco de dados
  • Performance
  • ORM
  • Backend
CompartilharWhatsAppLinkedIn

Resolver de vez, com quem faz isso todo dia

Precisa de uma API ou integração que não caia quando o negócio crescer?

Este artigo mostra o caminho. A implementação sob medida — o detalhe que muda o resultado no seu caso — é o trabalho da We Codex, empresa de engenharia do grupo Wocom.