DEV Community

Gabriel J
Gabriel J

Posted on

O que é o problema de consulta N+1 e como corrigi-lo?

Já não é nenhuma novidade que bancos de dados normalmente tendem a ser "lentos", porem algo que pode prejudicar muito neste quesito talvez seja o que iremos abordar neste artigo.

O problema de consulta N+1 ocorre quando seu código executa um número instruções de consulta adicionais para buscar os mesmos dados que poderiam ter sido recuperados ao executar a consulta primária.

Uma analogia que pode explicar isso com muita clareza talvez seja a de fazer um bolo de chocolate.

Image description

Imagine que você quer assar um bolo.
Na casa que você está a despensa fica fora da cozinha.
Você vai até seu quarto, pega um livro de receitas, e volta para a cozinha.

Então você verifica o primeiro item:

  • 250 gramas de gotas de chocolate

Você vai à despensa buscar o chocolate, volta para a cozinha e lê a segunda linha:

  • 3 Ovos

Você vai à despensa buscar os ovos, volta para a cozinha e lê a terceira linha:

  • 130 gramas de manteiga

Logicamente cansado por todas aquelas idas e vindas, você toma o caminho para a despensa, DE NOVO. Se ao menos houvesse uma maneira mais simples…

O que aconteceria com você, se cozinhasse dessa maneira, é exatamente o que acontece quando temos um problema de consulta N+1. Seu ORM é forçado pelo seu código a fazer várias consultas adicionais (como as viagens de ida e volta para buscar os ingredientes) após a primeira consulta inicial (quando você buscou sua receita).

Como prevenir?

Saber como corrigir esses problemas é ótimo. Mas saber como evitar que eles entrem na sua base de código é ainda melhor!

Caso seu banco seja em Ruby a biblioteca Doctolib pode te ajudar. Ele ajuda você a capturar N+1 consultas enquanto desenvolve seu aplicativo da web.

Caso a linguagem seja java utilioze a biblioteca spring-hibernate-query-utils, ela faz com que seus testes falhem se N+1 consultas forem detectadas.

Se o ORM for em PHP implemente um mecanismo inteligente de carregamento antecipado "The Database Machine".

Caso use Python, "nplusone", uma biblioteca python para detectar o problema de consultas n+1 em Python ORMs, incluindo SQLAlchemy, Peewee e Django ORM.

Agora que você já sabe o que é uma consulta N+1, como corrigi-la e como detectá-la, esperamos que você não volte a despensa quase de mãos vazias.

Top comments (0)