Įprasti N+1 užklausos problemos požymiai apima šiuos išsamius rodiklius:
- Per didelis užklausų skaičius: Akivaizdžiausias ženklas yra tas, kad jūsų programa įvykdo daug daugiau duomenų bazių užklausų, nei tikėtasi. Paprastai jūs matote vieną pradinę užklausą, kad gautumėte įrašų sąrašą, o po to pateikiama papildoma kiekvieno įrašo užklausa, kad gautumėte susijusius duomenis. Pvz., Pateikite 10 vartotojų ir atlikite 10 atskirų užklausų, kad kiekvieno vartotojo pranešimai gautų 11 užklausų, o ne tik vieną optimizuotą užklausą [1] [3].
- Lėtai taikymo atsakymo laikas: Kadangi kiekvienai užklausai reikia kelionės į duomenų bazę į abi pusę, daugelio mažų užklausų kaupiamasis poveikis žymiai sulėtina duomenų gavimą. Tai lemia lėtesnius puslapių apkrovas ar API atsakymus, todėl programa tampa mažiau reaguojanti į vartotojo užklausas [1] [5].
- Didelė duomenų bazės apkrova: Duomenų bazės serveris patiria padidėjusią apkrovą dėl daugybės užklausų, kurios gali nutiesti išteklius ir sumažinti bendrą sistemos pralaidumą. Tai gali pabloginti našumą ir apriboti mastelį, nes auga vartotojų ar duomenų skaičius [3] [5] [6].
- Nematomas lėto užklausų žurnaluose: Skirtingai nuo vienos lėtos užklausos, „N+1“ problema dažnai nepastebima lėto užklausų žurnaluose, nes kiekviena atskira užklausa greitai vykdoma. Tačiau bendras daugelio užklausų poveikis sukelia veiklos pablogėjimą [2].
- Netikėtos ar paslėptos užklausos, kurias sukelia ORM: Naudojant objektų-ryšių žemėlapių (ORM) rėmus, „N+1“ problema dažnai kyla dėl tinginio pakrovimo ar klaidingo konfigūracijos. Prieiga prie susijusių subjektų kilpoje gali sukelti papildomų užklausų be aiškių kodo skambučių, todėl sunku aptikti tiesiog peržvelgiant šaltinio kodą [2] [5] [6].
- Duomenų gavimo modelių našumo kliūtys: Jei jūsų programoje yra sudėtingi objektų santykiai ir pateikiami susiję duomenys keliais žingsniais, o ne vienoje optimizuotoje užklausoje, šis modelis yra stiprus N+1 problemos rodiklis [6].
Apibendrinant galima pasakyti, kad įprasti ženklai yra netikėtai didelis duomenų bazių užklausų skaičius, kuris turėtų būti paprastas duomenų gavimas, lėtas reagavimo laikas dėl kelių duomenų bazių kelionių duomenų bazėje, padidėjęs duomenų bazės serverio apkrova ir sunkumai pastebėti problemą, nes kiekviena užklausa individualiai vykdo greitai, bet kartu sukelia vėlavimus. Šie simptomai yra ypač paplitę naudojant ORM, turinčias numatytą tinginio apkrovos elgseną [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.neurelo.com/post/what-is-the-n-1-query-prlemlem
[7] https://dev.to/lovestaco/the-n1-query-prlemlem-the-silent-performance-killer-2b1c
]