Įprasti klaidos, dėl kurių kyla N+1 užklausos problema, paprastai sukasi apie tai, kaip duomenys yra gauti iš duomenų bazės, ypač kai naudojami objektų-reliacinio žemėlapių (ORM) sistemos arba rašant duomenų bazės užklausas rankiniu būdu. Čia pateikiami išsamūs šių klaidų paaiškinimai:
** 1. Susijusių duomenų pateikimas atskiromis užklausomis
Pagrindinė „N+1“ užklausos problemos priežastis yra kodo struktūra, kad pirmiausia gautumėte įrašų sąrašą su viena užklausa, tada kiekvieno įrašo pateikimo papildomos užklausos vykdymas, kad būtų galima gauti susijusius duomenis. Pvz., Užklausa vartotojų sąrašo ir atskirai užklausos kiekvienam vartotojui užklausos, pateikiamos 1 užklausa vartotojams ir „N“ užklausoms, kur N yra vartotojų skaičius. Tai sukelia daugybę mažų užklausų, o ne vieną optimizuotą užklausą [1] [2] [3] [7].
** 2. Remdamiesi tinginiu krovimu pagal numatytuosius nustatymus
Daugelis ORM naudoja tingų krovimą kaip numatytąją gavimo strategiją, o tai reiškia, kad susiję subjektai yra gauti tik tada, kai aiškiai pasiekiama. Nors tai gali sutaupyti išteklių, jei susiję duomenys nereikalingi, todėl kelis klausimus sukelia pakartojant kolekcijas, nesąmoningai sukeldami N+1 problemą. Pavyzdžiui, prieiga prie kiekvieno tinklaraščio įrašo autoriaus atskirai suaktyvina atskirą užklausą kiekviename įraše [5].
** 3. Aklai pakartotinai panaudojant užklausas be kontekstinių pakeitimų
Pakartotinai panaudojus tą pačią užklausą skirtingose programos dalyse, jos nesudarant, ji gali sukelti nereikalingą duomenų gavimą ir pabloginti N+1 problemą. Užklausos, kurios nėra optimizuotos konkrečiems naudojimo atvejams, gali gauti neišsamių duomenų, paskatindami vėliau gauti papildomų užklausų, kad vėliau būtų galima gauti susijusią informaciją [8].
** 4. Nenaudokite nekantrių pakrovimo ar užklausų optimizavimo metodų
Nepavyko naudoti nekantrios pakrovimo (susijusių duomenų pateikimo pradinėje užklausoje) arba optimizuoti sujungimo rezultatai, gaunami kelios duomenų bazės apvalkalai. Tai atsitinka, kai kūrėjai aiškiai nurodo savo „ORM“ ar „Query Builder“ įkelti susijusius subjektus kartu, todėl vietoj vieno, efektyvaus [5] [6] [7] sukelia daug mažų užklausų.
** 5. Iškreipkite į duomenų bazės daugybinių abiturientų poveikį
Kūrėjai kartais daro prielaidą, kad daug mažų užklausų yra greitesnės nei viena sudėtinga užklausa, tačiau kiekviena užklausa apima tinklo delsos ir apdorojimo pridėtines išlaidas. Bendras N+1 užklausų poveikis žymiai sulėtina programos atsakymo laiką ir padidina duomenų bazės apkrovą, ypač didėjant duomenų tūriui [1] [3] [5].
** 6. Suvokimo ar problemos nustatymo stoka
Kadangi kiekviena atskira „N+1“ šablono užklausa greitai veikia, ji dažnai neatsiranda lėto užklausų žurnaluose ar stebėjimo įrankiuose, todėl tai yra tylus našumo žudikas. Kūrėjai gali nepastebėti problemos, kol programos reagavimas žymiai pablogės [2] [5] [7].
Apibendrinant galima pasakyti, kad „N+1“ užklausos problema kyla daugiausia dėl neefektyvių duomenų, kurie konkrečiai pateikia modelius, užklausa susijusių duomenų atskirose kiekvieno įrašo užklausose, o ne surinkus ar sujungus užklausas. Tai dažnai sukelia numatytasis tingus ORM įkėlimas, nenaudojant nekantrios pakrovimo ar paketų ir pakartotinai panaudojant bendrąsias užklausas be optimizavimo. Rezultatas yra per didelė duomenų bazės apvaliosios vertybiniai popieriai, kurie pablogina našumą ir mastelio keitimą [1] [2] [3] [5] [6] [7].
Citatos:
[1] https://planetscale.com/blog/what-is-n-1-query-prlemlem-and-how-to-solve-it
[2] https://stackoverflow.com/questions/97197/what-is-the-n1-selects-prlemlem-in-orm-object-relational-ming-ming
[3] https://www.pingcap.com/article/how-to-feffefient-solve-the-n1-query-prlemlem/
[4] https://evnedev.com/blog/development/the-n1-query-prlemlem-what-is-it-and-how-do-you-solve- it/
[5] https://digma.ai/n1-query-prlemlem-and-how-o
[6] https://www.linkedin.com/posts/aftab-hmed-bb002827_avoiding-the-n1-query-prlemlem-a-common-actity-727052762970818561-ZMZ6
[7] https://dev.to/lovestaco/the-n1-query-prlemlem-the-silent-performance-killer-2b1c
[8] https://www.okoone.com/spark/technology-innovation/avoid-these-7-sql-mistakes-for-better-database-Management/