ExpertiDict

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

N mais um

/ˈɛni mɐjs ˈũ/substantivo

Problema de desempenho em que uma consulta traz N registros e cada um dispara outra para um dado associado, totalizando N+1 idas ao banco. Resolve-se com includes.

Onde usar

Aparece em listagens que acessam associações dentro de um laço ou de uma view e se revela nos logs como dezenas de SELECTs iguais. Ferramentas como Bullet ajudam a detectar.

Em código

# N+1: uma consulta por autor
Livro.all.each { |l| puts l.autor.nome }

# resolvido com includes
Livro.includes(:autor).each do |l|
  puts l.autor.nome
end

Exemplos

Esse laço tem um N mais um: cada livro consulta o autor.

Resolvi o N mais um com includes.

Cuidado

Não use includes por reflexo: ele carrega tudo que foi pedido, mesmo sem uso. Carregue só o que a tela exibe.

Sinônimos

N+1

Antônimos

eager loading

Veja também

Todos os termos de Ruby