ExpertiDict

Java · Intermediário · Português · Técnico

problema N+1

/pɾoˈblemɐ ˈɛni mɐ̃jz ˈũ/substantivo

Armadilha de ORM em que uma consulta traz N entidades e depois cada uma dispara outra consulta para carregar uma relação, somando N+1 consultas.

Onde usar

Aparece quando uma listagem fica lenta; o log SQL do Hibernate mostra dezenas de selects iguais. Corrige-se com join fetch ou @EntityGraph.

Em código

// 1 select de pedidos + 1 por cliente
var ps = repo.findAll();
ps.forEach(p -> p.getCliente().getNome());
// solução: uma consulta com join fetch
@Query("select p from Pedido p "
    + "join fetch p.cliente")
List<Pedido> comCliente();

Exemplos

A listagem está lenta por causa do problema N+1.

Resolvi o N+1 com um join fetch na consulta.

Cuidado

Trocar o fetch para EAGER não resolve e pode piorar; resolva na consulta, com join fetch.

Sinônimos

N+1 selects

Veja também

Todos os termos de Java