Sobes.tech
Middle

Qu'est-ce que le problème de l'échantillon n+1?

sobes.tech IA

Réponse de l'IA

Il s'agit d'un problème de performance lors de l'utilisation de bases de données, lorsque pour obtenir des données liées, il faut N+1 requêtes au lieu d'une seule.

Cela se produit lorsque :

  1. Une requête est effectuée pour obtenir la liste des entités principales.
  2. Ensuite, pour chacune de ces entités, une requête séparée est effectuée pour obtenir les entités enfants liées.

Exemple en JPA :

// Récupérer la liste des utilisateurs
List<User> users = userRepository.findAll();

// Pour chaque utilisateur, récupérer ses commandes
for (User user : users) {
    List<Order> orders = user.getOrders(); // Appelle N requêtes à la base de données, une par utilisateur
}

Solution : Utiliser des requêtes avec chargement des données liées en une seule fois :

  1. JOIN FETCH : Charger les entités liées avec l'entité principale en une seule requête.

    // Exemple avec JPQL
    List<User> users = entityManager.createQuery("SELECT u FROM User u JOIN FETCH u.orders", User.class).getResultList();
    
  2. EntityGraph : Définir un graphe d'entités pour indiquer quelles relations doivent être chargées.

    // Au niveau de l'entité
    @Entity
    @NamedEntityGraph(name = "User.orders", attributeNodes = @NamedAttributeNode("orders"))
    public class User {
        // ...
    }
    
    // Utilisation dans le repository
    @Query("SELECT u FROM User u")
    @EntityGraph(value = "User.orders")
    List<User> findAllWithOrders();
    
  3. Batch Fetching : Charger les objets liés par lots (l'ORM peut faire cela en arrière-plan avec une configuration appropriée).

Résoudre le problème N+1 améliore considérablement la performance des applications en réduisant le nombre d'appels à la base de données.