Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Aké sú niektoré bežné chyby, ktoré vedú k problému s dotazom N 1


Aké sú niektoré bežné chyby, ktoré vedú k problému s dotazom N 1


Bežné chyby, ktoré vedú k problému s dotazom N+1, sa vo všeobecnosti točia okolo toho, ako sa údaje načítajú z databázy, najmä pri používaní rámcov mapovania (ORM) relatívnej objektov (ORM) alebo ručne písania databázových dopytov. Tu sú podrobné vysvetlenia týchto chýb:

** 1. Načítanie súvisiacich údajov v samostatných dopytoch
Primárnou príčinou problému s dotazom N+1 je štruktúrovanie kódu na najskôr načítať zoznam záznamov s jedným dotazom a potom vykonať ďalší dotaz pre každý záznam na načítanie údajov súvisiacich s údajmi. Napríklad dotazovanie zoznamu používateľov a potom osobitne dotazovanie príspevkov pre každého používateľa vedie k 1 dotazu pre používateľov plus n dotazy pre príspevky, kde n je počet používateľov. To vedie k mnohým malým dotazom namiesto jedného optimalizovaného dotazu [1] [2] [3] [7].

** 2. Predvolene sa spolieha na lenivé načítanie
Väčšina ORM používa lenivé načítanie ako predvolenú stratégiu načítania, čo znamená, že súvisiace entity sa načítajú iba pri výslovne pri prístupe. Aj keď to môže ušetriť zdroje, ak súvisiace údaje nie sú potrebné, spôsobuje to, že pri opakovaní kolekcií sa nevedomky spôsobuje viac otázok, čo nevedomky spôsobuje problém N+1. Napríklad prístup k autorovi každého blogového príspevku individuálne spúšťa samostatný dotaz na príspevok [5].

** 3. Slepo opätovné použitie dotazov bez kontextových úprav
Opätovné použitie toho istého dotazu v rôznych častiach aplikácie bez prispôsobenia môže spôsobiť zbytočné získavanie údajov a zhoršiť problém N+1. Dotazy, ktoré nie sú optimalizované pre konkrétne prípady použitia, môžu načítať neúplné údaje, čo viedlo k ďalším dotazom, aby sa neskôr načítali súvisiace informácie [8].

** 4. Nepoužívajte dychtivé techniky načítania alebo optimalizácie dotazov
Nepoužívanie dychtivého načítania (načítať súvisiace údaje v počiatočnom dotaze) alebo optimalizované spojenie vedie k viacerým spiatočným úvodom do databázy. Stáva sa to, keď vývojári výslovne neinportujú svojim staviteľom ORM alebo Query, aby naložil entity súvisiace s nimi, čo vedie k mnohým malým dotazom namiesto jediného, ​​efektívneho [5] [6] [7].

** 5. Ignorovanie vplyvu viacerých spiatočných úvodov na databázu
Vývojári niekedy predpokladajú, že mnoho malých dotazov je rýchlejších ako jeden zložitý dotaz, ale každý dotaz zahŕňa latenciu siete a režijné náklady na spracovanie. Kumulatívny účinok dotazov N+1 významne spomaľuje časy odozvy aplikácie a zvyšuje zaťaženie databázy, najmä s rastúcou objemom údajov [1] [3] [5].

** 6. Nedostatok povedomia alebo zisťovanie problému
Pretože každý jednotlivý dotaz v vzorke N+1 beží rýchlo, často sa neobjavuje v protokoloch pomalých dotazov alebo monitorovacích nástrojoch, čím sa stáva tichým vrahom výkonu. Vývojári si nemusia všimnúť problém, kým sa responzívnosť aplikácie výrazne neznižuje [2] [5] [7].

Stručne povedané, problém s dotazom N+1 vzniká hlavne v dôsledku neefektívnych vzorov načítania údajov, špecificky, dotazujú údaje súvisiace s dotazovaním v samostatných dopytoch pre každý záznam, a nie dávku alebo spojenie dotazov. Toto je často spôsobené predvoleným lenivým načítaním v ORM, nepoužívaním dychtivého načítania alebo dávkovania a opätovným použitím všeobecných dotazov bez optimalizácie. Výsledkom sú nadmerné spiatočky na databázu, ktoré degradujú výkon a škálovateľnosť [1] [2] [3] [5] [6] [7].

Citácie:
[1] https://planetscale.com/blog/what-is-n-1-query-problem-and-----solve-it
[2] https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem-in-orm-object-object-relational-mapping
[3] https://www.pingcap.com/article/how-to-efically-solve-the-n1-query-problem/
[4] https://evedev.com/blog/development/the-n1-query-problemlem-what-is-it-m-----tow---you-solve-it/
[5] https://digma.ai/n1-query-problem-and-how-to-detect-it/
[6] https://www.linkedin.com/posts/aftab-ahmed-bb002827_aviding-the-n1-query-problem --common-activity-common-comctivity-7270527662970818561-Zmz6
[7] https://dev.to/lovestaco/the-w1-query-problem-the-silent-performance-killer-2b1c
[8] https://www.okoone.com/spark/technology-innovation/avaid-thetes-7-sql-mistakakes-for-better-database-management/