Parastās kļūdas, kas noved pie N+1 vaicājuma problēmas, parasti griežas ap to, kā dati tiek iegūti no datu bāzes, it īpaši, ja objektu relāciju kartēšanas (ORM) ietvaros vai manuāli raksta datu bāzes vaicājumus. Šeit ir detalizēti šo kļūdu skaidrojumi:
** 1. Ar saistītu datu iegūšana atsevišķos vaicājumos
N+1 vaicājuma problēmas galvenais iemesls ir koda strukturēšana, lai vispirms iegūtu ierakstu sarakstu ar vienu vaicājumu, pēc tam katram ierakstam izpildot papildu vaicājumu, lai atnestu saistītus datus. Piemēram, vaicājot lietotāju sarakstu un pēc tam atsevišķi vaicājot ziņojumus par katru lietotāju, tiek iegūts 1 vaicājums lietotājiem, kā arī n jautājumi ziņām, kur n ir lietotāju skaits. Tas noved pie daudziem maziem vaicājumiem, nevis vienu optimizētu vaicājumu [1] [2] [3] [7].
** 2. Balstoties uz slinku ielādi pēc noklusējuma
Lielākā daļa ORM izmanto slinku ielādi kā noklusējuma iegūšanas stratēģiju, kas nozīmē, ka saistītās entītijas tiek atnestas tikai tad, ja tām ir skaidri pieejama. Lai gan tas var ietaupīt resursus, ja nav nepieciešami saistīti dati, tas izraisa vairāku vaicājumu iedarbināšanu, kad tiek atkārtoti kolekcijas, neapzināti izraisot N+1 problēmu. Piemēram, piekļuve katra emuāra ziņojuma autoram individuāli izraisa atsevišķu vaicājumu uz vienu pastu [5].
** 3. Akli atkārtoti izmantojot vaicājumus bez kontekstuāliem pielāgojumiem
Pārkārtojot to pašu vaicājumu dažādās lietojumprogrammas daļās, nepielāgojot, tas var izraisīt nevajadzīgu datu iegūšanu un saasināt N+1 problēmu. Vaicājumi, kas nav optimizēti konkrētiem lietošanas gadījumiem, var iegūt nepilnīgus datus, pamudinot papildu vaicājumus, lai vēlāk iegūtu saistīto informāciju [8].
** 4. Neizmantojiet dedzīgu iekraušanu vai vaicājuma optimizācijas paņēmienus
Neizmantojot dedzīgu ielādi (saistītu datu iegūšana sākotnējā vaicājumā) vai optimizēta pievienošanās rezultāti, kas iegūti vairākos datu bāzē. Tas notiek, ja izstrādātāji skaidri neiecina savu ORM vai vaicājumu veidotāju, lai ielādētu saistītas vienības kopā, izraisot daudzus mazus jautājumus, nevis vienu, efektīvu [5] [6] [7].
** 5. Ignorējot vairāku turp un atpakaļ triecienu ietekmi uz datu bāzi
Izstrādātāji dažreiz pieņem, ka daudzi mazi vaicājumi ir ātrāki nekā viens sarežģīts vaicājums, bet katrs vaicājums ir saistīts ar tīkla latentumu un virs galvas. N+1 vaicājumu kumulatīvā iedarbība ievērojami palēnina lietojumprogrammas reakcijas laiku un palielina datu bāzes slodzi, jo īpaši tāpēc, ka pieaug datu tilpums [1] [3] [5].
** 6. Izpratnes trūkums vai problēmas atklāšana
Tā kā katrs atsevišķais vaicājums N+1 modelī darbojas ātri, tas bieži neparādās lēnos vaicājuma žurnālos vai uzraudzības rīkos, padarot to par klusu veiktspējas slepkavu. Izstrādātāji, iespējams, nepamanīs problēmu, kamēr pieteikuma atsaucība ievērojami noārdās [2] [5] [7].
Rezumējot, N+1 vaicājuma problēma rodas galvenokārt tāpēc, ka ir neefektīvi datu iegūšanas modeļi, kas ir paredzēti, vaicājot saistītus datus atsevišķos vaicājumos katram ierakstam, nevis partiju vai pievienošanās vaicājumiem. To bieži izraisa noklusējuma slinka iekraušana ORM, nepacietīgas ielādes vai pakešu izmantošana un vispārīgu vaicājumu atkārtota izmantošana bez optimizācijas. Rezultāts ir pārmērīgs datu bāzes turp un atpakaļ, kas noārda veiktspēju un mērogojamību [1] [2] [3] [5] [6] [7].
Atsauces:
[1.]
[2] https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem-in-orm-object-relational kartēšana
[3] https://www.pingcap.com/article/how-to-feficply-strive-the-n1-query-problem/
[4] https://evnedev.com/blog/development/the-n1-query-problem-what-is-it-and-how-do-you-solve-it/
[5] https://digma.ai/n1-query-problem-and-how-to-detect-it/
.
[7] https://dev.to/lovestaco/the-n1-query-problem-the-silent-performance-killer-2b1c
[8] https://www.okoone.com/spark/technology-innovation/avoid-these-7-sql-mistakes-for-better-database-management/