ANÚNCIO

~/questoes/programacao

O que é o padrão N+1 em queries de banco de dados?

Responda, confira o feedback e use o resultado para orientar sua revisão.
Para fixar

Padrão N+1: O Vilão Invisível das Queries

Conceito central

O problema N+1 ocorre quando você executa uma query inicial para buscar N registros e depois faz mais N queries adicionais (uma para cada resultado), causando desperdício de recursos. É uma armadilha comum ao trabalhar com ORMs como SQLAlchemy em FastAPI, especialmente com relacionamentos entre tabelas.

Por que essa resposta faz sentido

A alternativa correta descreve exatamente o problema N+1: uma query inicial mais N queries desnecessárias adicionais. Esse padrão é ineficiente porque faz requisições repetidas ao banco de dados quando uma única query otimizada resolveria a situação.

Armadilhas comuns

  • Confundir N+1 com problemas de replicação ou particionamento de dados — N+1 é exclusivamente sobre quantidade de queries executadas.
  • Não perceber que está sofrendo N+1 até o projeto crescer — em pequenos datasets o problema é invisível, mas em produção causa timeouts e lentidão severa.
  • Assumir que índices resolvem o problema — índices ajudam, mas a solução real é usar eager loading (joinedload, selectinload no SQLAlchemy) ou reescrever a lógica com uma única query bem construída.

Entenda as alternativas

A

Essa alternativa descreve replicação de dados e backups, que são conceitos de redundância e disponibilidade. Não tem relação com o problema N+1, que é sobre quantidade de queries executadas, não sobre replicação de dados.

B

Sharding e particionamento de dados são estratégias de escalabilidade horizontal. Embora úteis para sistemas grandes, não resolvem o problema N+1, que é uma questão de eficiência na forma como as queries são feitas.

C

Esta é a definição precisa do padrão N+1. Você executa uma query para buscar N registros (por exemplo, todos os usuários) e depois executa N queries adicionais (uma query por usuário para buscar seus pedidos). É ineficiente e fácil de evitar com eager loading.

D

Usar múltiplos índices pode otimizar uma single query complexa, mas não está relacionado ao problema N+1. Índices melhoram a velocidade de execução individual das queries, não reduzem o número desnecessário de queries.

Dica prática: Em FastAPI com SQLAlchemy, quando você carrega um usuário e depois acessa `usuario.pedidos` em um loop, você está criando N+1 queries. Solucione isso usando `db.query(User).options(joinedload(User.pedidos)).all()` para trazer tudo em uma única query. Sempre revise o SQL gerado durante desenvolvimento para detectar esse padrão cedo.

Revise pensando: Se você executa uma query para buscar 100 usuários e depois faz um loop acessando os pedidos de cada um sem eager loading, quantas queries você está fazendo no total?