Almindelige fejl, der fører til N+1-forespørgselsproblemet, drejer sig generelt om, hvordan data hentes fra en database, især når man bruger objekt-relationel kortlægning (ORM) rammer eller skrivedatabaseforespørgsler manuelt. Her er detaljerede forklaringer på disse fejl:
** 1. Hentning af relaterede data i separate forespørgsler
En primær årsag til N+1 -forespørgselsproblemet er at strukturere kode til først at hente en liste over poster med en forespørgsel og derefter udføre en yderligere forespørgsel for hver post for at hente relaterede data. For eksempel resulterer forespørgsel om en liste over brugere og derefter separat forespørgsel om indlæg for hver bruger i 1 forespørgsel for brugere plus n forespørgsler til indlæg, hvor n er antallet af brugere. Dette fører til mange små forespørgsler i stedet for en optimeret forespørgsel [1] [2] [3] [7].
** 2. At stole på doven belastning som standard
De fleste ORM'er bruger doven belastning som standardhentningsstrategi, hvilket betyder, at relaterede enheder kun hentes, når de eksplicit er tilgængelige. Selvom dette kan spare ressourcer, hvis der ikke er behov for relaterede data, får det flere forespørgsler til at blive udløst, når der itererer over samlinger, hvilket ubevidst forårsager N+1 -problemet. For eksempel udløser adgangen til forfatteren af hvert blogindlæg individuelt en separat forespørgsel pr. Indlæg [5].
** 3. Blindt genbrug af forespørgsler uden kontekstuelle justeringer
Genbrug af den samme forespørgsel på tværs af forskellige dele af en applikation uden at skræddersy det kan forårsage unødvendig dataindhentning og forværre N+1 -problemet. Forespørgsler, der ikke er optimeret til specifikke brugssager, kan hente ufuldstændige data, hvilket får yderligere forespørgsler til at hente relaterede oplysninger senere [8].
** 4. Brug ikke ivrige belastnings- eller forespørgselsoptimeringsteknikker
Manglende brug af ivrig indlæsning (hentning af relaterede data i den indledende forespørgsel) eller optimerede slutter sig til resultater i flere rundtider til databasen. Dette sker, når udviklere ikke eksplicit instruerer deres ORM- eller forespørgselsbygger til at indlæse relaterede enheder sammen, hvilket fører til mange små forespørgsler i stedet for en enkelt, effektiv [5] [6] [7].
** 5. Ignorerer virkningen af flere rundeforløb til databasen
Udviklere antager undertiden, at mange små forespørgsler er hurtigere end en kompleks forespørgsel, men hver forespørgsel involverer netværksforsinkelse og behandlingsomkostninger. Den kumulative virkning af N+1 -forespørgsler bremser signifikant på applikationsresponstider og øger databasebelastningen, især når datavolumen vokser [1] [3] [5].
** 6. Manglende opmærksomhed eller påvisning af problemet
Fordi hver enkelt forespørgsel i N+1 -mønsteret kører hurtigt, vises det ofte ikke i langsomt forespørgselslogfiler eller overvågningsværktøjer, hvilket gør det til en stille performance -morder. Udviklere bemærker muligvis ikke problemet, før applikationens lydhørhed forringes markant [2] [5] [7].
I resumé opstår N+1-forespørgselsproblemet hovedsageligt på grund af ineffektive datahentningsmønstre-specifikt, forespørgsel om relaterede data i separate forespørgsler for hver post snarere end batching eller sammenføjning af forespørgsler. Dette er ofte forårsaget af standard doven belastning i ORMS, manglende brug af ivrig belastning eller batching og genbrug af generiske forespørgsler uden optimering. Resultatet er overdreven database -runde -rettelser, der forringer ydeevne og skalerbarhed [1] [2] [3] [5] [6] [7].
Citater:
)
[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-efficently-solve-the-n1-query-problem/
)
)
)
[7] https://dev.to/lovestaco/the-n1-query-problem-the-silent-performance-mails-2b1c
[8] https://www.okoone.com/spark/technology-innovation/avoid-these-7-sql-mistakes-for-better-database-management/