Gli errori comuni che portano al problema della query N+1 generalmente ruotano attorno al modo in cui i dati vengono recuperati da un database, soprattutto quando si utilizzano i framework di mappatura-relazionale degli oggetti (ORM) o scrivendo le query di database manualmente. Qui ci sono spiegazioni dettagliate di questi errori:
** 1. Recuperare i dati correlati in query separate
Una causa primaria del problema della query N+1 è la strutturazione del codice per recuperare prima un elenco di record con una query, quindi eseguire una query aggiuntiva per ciascun record per recuperare i dati correlati. Ad esempio, interrogare un elenco di utenti e quindi interrogare separatamente i post per ciascun utente porta 1 query per gli utenti più N query per i post, dove N è il numero di utenti. Questo porta a molte piccole query invece di una query ottimizzata [1] [2] [3] [7].
** 2. Affidarsi al caricamento pigro per impostazione predefinita
La maggior parte degli ormi utilizza il caricamento pigro come strategia di recupero predefinita, il che significa che le entità correlate vengono recuperate solo quando si accede esplicitamente. Sebbene ciò possa risparmiare risorse se non sono necessari dati correlati, provoca l'attivazione di più query durante l'iterazione delle raccolte, causando inconsapevolmente il problema N+1. Ad esempio, l'accesso all'autore di ciascun post del blog innesca individualmente una query separata per post [5].
** 3. Riutilizzare ciecamente le query senza aggiustamenti contestuali
Il riutilizzo della stessa query su diverse parti di un'applicazione senza adattarsi può causare un recupero di dati non necessario ed esacerbare il problema N+1. Le query che non sono ottimizzate per casi d'uso specifici possono recuperare dati incompleti, spingendo ulteriori domande a recuperare le informazioni correlate in seguito [8].
** 4. Non utilizzando tecniche di caricamento desideroso o di ottimizzazione delle query
La mancata utilizzo del caricamento desideroso (recupero dei dati correlati nella query iniziale) o join ottimizzati si traducono in più roundtrips nel database. Ciò accade quando gli sviluppatori non istruiscono esplicitamente il loro ORM o query Builder di caricare insieme entità correlate, portando a molte piccole query anziché a una singola, efficiente [5] [6] [7].
** 5. Ignorare l'impatto di più roundtrips nel database
Gli sviluppatori a volte presuppongono che molte piccole query siano più veloci di una query complessa, ma ogni query comporta la latenza di rete e l'elaborazione delle spese generali. L'effetto cumulativo delle query N+1 rallenta significativamente i tempi di risposta dell'applicazione e aumenta il carico del database, in particolare quando il volume dei dati aumenta [1] [3] [5].
** 6. Mancanza di consapevolezza o rilevamento del problema
Poiché ogni singola query nel modello N+1 funziona rapidamente, spesso non appare nei registri delle query lenti o negli strumenti di monitoraggio, rendendolo un killer di prestazioni silenzioso. Gli sviluppatori potrebbero non notare il problema fino a quando la reattività dell'applicazione non degrada in modo significativo [2] [5] [7].
In sintesi, il problema delle query N+1 si presenta principalmente a causa di modelli inefficienti di recupero dei dati, interrogando i dati correlati in query separate per ciascun record anziché per le query in lente o unione. Ciò è spesso causato dal caricamento pigro predefinito in ORM, non riuscire a utilizzare caricamento o batching desideroso e riutilizzo di query generiche senza ottimizzazione. Il risultato è un passo di andata e ritorno del database eccessivo che degradano le prestazioni e la scalabilità [1] [2] [3] [5] [6] [7].
Citazioni:
[1] https://planetscale.com/blog/what-is-1-1-query-problem-and-how-to-to-sol-it
[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-efficient-solve-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-to-dect-it/
[6] https://www.linkedin.com/posts/aftab-ahmed-bb002827_avoiding-the-n1-query-problem-a-common-activity-727052762970818561-zmz6
[7] https://dev.to/lovestaco/the-n1-query-problem-the silent -performance-killer-2b1c
[8] https://www.okoone.com/spark/technology-nnovation/avoid-these-7-sql-mistakes-for-better-database-management/