Les erreurs courantes qui conduisent au problème de la requête N + 1 tournent généralement autour de la façon dont les données sont récupérées à partir d'une base de données, en particulier lors de l'utilisation manuellement de mappage de mappage relationnel d'objet ou d'écriture de la base de données. Voici des explications détaillées de ces erreurs:
** 1. Récupérer des données connexes dans des requêtes distinctes
Une cause principale du problème de requête N + 1 est de structurer le code pour récupérer d'abord une liste d'enregistrements avec une requête, puis d'exécuter une requête supplémentaire pour chaque enregistrement pour récupérer les données connexes. Par exemple, la question de l'interrogation d'une liste d'utilisateurs, puis de requête séparément sur les publications pour chaque utilisateur entraîne 1 requête pour les utilisateurs plus n requêtes pour les publications, où n est le nombre d'utilisateurs. Cela conduit à de nombreuses petites requêtes au lieu d'une requête optimisée [1] [2] [3] [7].
** 2. S'appuyer sur le chargement paresseux par défaut
La plupart des orms utilisent le chargement paresseux comme stratégie de récupération par défaut, ce qui signifie que les entités associées ne sont récupérées que lorsqu'elles sont explicitement accessibles. Bien que cela puisse économiser des ressources si les données connexes ne sont pas nécessaires, cela entraîne le déclenchement de plusieurs requêtes lors de l'itération des collections, provoquant sans le savoir le problème N + 1. Par exemple, l'accès à l'auteur de chaque article de blog déclenche individuellement une requête distincte par article [5].
** 3. Réutiliser aveuglément les requêtes sans ajustements contextuels
La réutilisation de la même requête sur différentes parties d'une application sans personnaliser peut provoquer une récupération de données inutile et exacerber le problème N + 1. Les requêtes qui ne sont pas optimisées pour des cas d'utilisation spécifiques peuvent récupérer des données incomplètes, ce qui incite des requêtes supplémentaires à récupérer des informations connexes plus tard [8].
** 4. N'utilisant pas de techniques de chargement ou d'optimisation de requête impatientes
Le fait de ne pas utiliser de chargement impatient (récupérer les données connexes dans la requête initiale) ou les jointures optimisées résulte de plusieurs aller-retour dans la base de données. Cela se produit lorsque les développeurs n'instruisent pas explicitement leur ORM ou leur constructeur de requête pour charger des entités liées, conduisant à de nombreuses petites requêtes au lieu d'une seule, efficace [5] [6] [7].
** 5. Ignorer l'impact de plusieurs aller-retour sur la base de données
Les développeurs supposent parfois que de nombreuses petites requêtes sont plus rapides qu'une requête complexe, mais chaque requête implique la latence du réseau et le traitement des frais généraux. L'effet cumulatif des requêtes N + 1 ralentit considérablement les temps de réponse de l'application et augmente la charge de la base de données, d'autant plus que le volume des données augmente [1] [3] [5].
** 6. Manque de sensibilisation ou de détection du problème
Étant donné que chaque requête individuelle du modèle N + 1 fonctionne rapidement, elle n'apparaît souvent pas dans les journaux de requête lente ou les outils de surveillance, ce qui en fait un tueur de performance silencieux. Les développeurs pourraient ne pas remarquer le problème tant que la réactivité de l'application se dégrade considérablement [2] [5] [7].
En résumé, le problème de la requête N + 1 se pose principalement en raison de modèles de données inefficaces, de la réalisation de modèles, interrogeant les données connexes dans des requêtes distinctes pour chaque enregistrement plutôt que par lots ou joignant des requêtes. Ceci est souvent causé par défaut de chargement paresseux dans les ORMS, le non-utilisation de chargement ou de lot désireux et de réutiliser des requêtes génériques sans optimisation. Le résultat est destiné à la base de données excessive qui dégrade les performances et l'évolutivité [1] [2] [3] [5] [6] [7].
Citations:
[1] https://planetscale.com/blog/what-is-n-1-Quey-problem-and-how-t-solve-it
[2] https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem-in-orm-object-lalation-mapping
[3] https://www.pingcap.com/article/how-to-oficiely-solve-the-n1-Query-problem/
[4] https://evnedev.com/blog/development/the-n1-Query-problem-what-is-it-and--do-you-solve-it/
[5] https://digma.ai/n1-Query-problem-and-fo-to-detect-it/
[6] https://www.linkedin.com/posts/aftab-ahmed-bb002827_avoiding-the-n1-Query-problem-a-common-activity-7270527662970818561-zz6
[7] https://dev.to/lovestaco/the-n1-Query-problem-the-Silent-performance-Killer-2b1c
[8] https://www.okoone.com/spark/technology-innovation/avoid-the-7-sql-mistakes-for-better-database-management/