Greșelile obișnuite care duc la problema de interogare N+1 se învârt, în general, în jurul modului în care datele sunt preluate dintr-o bază de date, în special atunci când se utilizează cadre de mapare a obiectelor-relaționale (ORM) sau scrierea manuală a interogărilor bazei de date. Iată explicații detaliate ale acestor greșeli:
** 1. Preluarea datelor conexe în întrebări separate
O cauză principală a problemei de interogare N+1 este structurarea codului pentru a prelua mai întâi o listă de înregistrări cu o singură interogare, apoi executarea unei interogări suplimentare pentru fiecare înregistrare pentru a obține date conexe. De exemplu, interogarea unei liste de utilizatori și apoi interogarea separat a postărilor pentru fiecare utilizator rezultă la 1 interogare pentru utilizatori, plus n întrebări pentru postări, unde n este numărul de utilizatori. Acest lucru duce la multe întrebări mici în loc de o interogare optimizată [1] [2] [3] [7].
** 2. Bazându -se pe încărcare leneșă în mod implicit
Majoritatea ORM -urilor folosesc încărcarea leneșă ca strategie implicită de preluare, ceea ce înseamnă că entitățile conexe sunt obținute numai atunci când sunt accesate în mod explicit. În timp ce acest lucru poate economisi resurse dacă nu sunt necesare date conexe, acestea determină declanșarea mai multor întrebări atunci când se iterează peste colecții, provocând fără să știe problema N+1. De exemplu, accesarea autorului fiecărei postări pe blog declanșează individual o interogare separată pe postare [5].
** 3. Reutilizarea ortografiei fără ajustări contextuale
Reutilizarea aceleiași interogări în diferite părți ale unei aplicații fără a adapta poate provoca recuperarea inutilă a datelor și a exacerba problema N+1. Interogările care nu sunt optimizate pentru cazuri de utilizare specifice pot obține date incomplete, ceea ce determină întrebări suplimentare pentru a obține informații legate mai târziu [8].
** 4. Nu folosiți tehnici de încărcare sau de optimizare a interogării dornice
Nerespectarea încărcării nerăbdătoare (preluarea datelor aferente în interogarea inițială) sau optimizați se alătură rezultatelor mai multor rotunde la baza de date. Acest lucru se întâmplă atunci când dezvoltatorii nu instruiesc în mod explicit ORM sau constructorul de interogare să încarce entități conexe împreună, ceea ce duce la multe interogări mici în loc de una singură, eficientă [5] [6] [7].
** 5. Ignorarea impactului mai multor rotunde în baza de date
Dezvoltatorii presupun uneori că multe interogări mici sunt mai rapide decât o interogare complexă, dar fiecare interogare implică latența rețelei și procesarea aeriană. Efectul cumulativ al interogărilor N+1 încetinește semnificativ timpii de răspuns al aplicației și crește încărcarea bazei de date, mai ales pe măsură ce volumul de date crește [1] [3] [5].
** 6. Lipsa de conștientizare sau detectarea problemei
Deoarece fiecare interogare individuală din modelul N+1 rulează rapid, de multe ori nu apare în jurnalele de interogare lente sau în instrumentele de monitorizare, ceea ce îl face un criminal de performanță tăcut. Este posibil ca dezvoltatorii să nu observe problema până când receptivitatea aplicației se degradează semnificativ [2] [5] [7].
În rezumat, problema de interogare N+1 apare în principal din cauza modelelor ineficiente de preluare a datelor în mod specific, interogarea datelor aferente în interogări separate pentru fiecare înregistrare, mai degrabă decât la preluarea sau unirea interogărilor. Acest lucru este adesea cauzat în mod implicit încărcarea leneșă în ORMS, eșecul de a utiliza încărcarea sau lotarea dornică și reutilizarea interogărilor generice fără optimizare. Rezultatul este excesiv de baze de date, care degradează performanța și scalabilitatea [1] [2] [3] [5] [6] [7].
Citări:
[1] https://planetscale.com/blog/what-is-n-1-query-problem-and-how-to-solve-it
[2] https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem-in-orm-object-relational-mapping
[3] https://www.pingcap.com/article/how-to-eficiently-solve-the-n1-query-problem/
]
[5] https://digma.ai/n1-query-problem-and-how-to-detect-it/
[6] https://www.linkedin.com/posts/aftab-ahmed-bb002827_avoiding-the-n1-query-problem-a-common-activitate-7270527662970818561-ZMZ6
[7] https://dev.to/lovestaco/the-n1-query-problem-the-silent-performance-killer-2b1c
[8] https://www.okoone.com/spark/technology-innovation/avoid-hese-7-sql-mistakes-for-better-database-management/