Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Ποια είναι μερικά κοινά λάθη που οδηγούν στο πρόβλημα του ερωτήματος N 1


Ποια είναι μερικά κοινά λάθη που οδηγούν στο πρόβλημα του ερωτήματος N 1


Τα συνηθισμένα λάθη που οδηγούν στο πρόβλημα του ερωτήματος N+1 γενικά περιστρέφονται γύρω από τον τρόπο με τον οποίο τα δεδομένα λαμβάνονται από μια βάση δεδομένων, ειδικά όταν χρησιμοποιείτε πλαίσια αντικειμενικής σχετικής χαρτογράφησης (ORM) ή γράφοντας ερωτήματα βάσης δεδομένων με μη αυτόματο τρόπο. Ακολουθούν λεπτομερείς εξηγήσεις για αυτά τα λάθη:

** 1. Λήψη σχετικών δεδομένων σε ξεχωριστά ερωτήματα
Μια πρωταρχική αιτία του προβλήματος ερωτήματος N+1 είναι η δομή του κώδικα για την πρώτη ανάκτηση μιας λίστας εγγραφών με ένα ερώτημα και, στη συνέχεια, εκτελώντας ένα πρόσθετο ερώτημα για κάθε εγγραφή για τη λήψη σχετικών δεδομένων. Για παράδειγμα, η ερώτηση μιας λίστας χρηστών και στη συνέχεια χωριστά η ερώτηση για κάθε χρήστη έχει ως αποτέλεσμα 1 ερώτημα για τους χρήστες και τα ερωτήματα N για αναρτήσεις, όπου n είναι ο αριθμός των χρηστών. Αυτό οδηγεί σε πολλά μικρά ερωτήματα αντί για ένα βελτιστοποιημένο ερώτημα [1] [2] [3] [7].

** 2. Βασιζόμενη σε τεμπέλης φόρτωσης από προεπιλογή
Τα περισσότερα Orms χρησιμοποιούν τεμπέλης φόρτωσης ως προεπιλεγμένη στρατηγική συγκέντρωσης, πράγμα που σημαίνει ότι σχετικές οντότητες λαμβάνονται μόνο όταν έχουν προσπερατότητα. Ενώ αυτό μπορεί να εξοικονομήσει πόρους εάν δεν απαιτούνται σχετικά δεδομένα, προκαλεί την ενεργοποίηση πολλαπλών ερωτημάτων κατά την εκτόξευση των συλλογών, προκαλώντας εν αγνοία το πρόβλημα N+1. Για παράδειγμα, η πρόσβαση στον συντάκτη κάθε δημοσίευσης ιστολογίου ενεργοποιεί ξεχωριστά ένα ξεχωριστό ερώτημα ανά θέση [5].

** 3. Επαναχρησιμοποιώντας τα ερωτήματα χωρίς ρυθμίσεις συμφραζομένων
Η επαναχρησιμοποίηση του ίδιου ερωτήματος σε διάφορα μέρη μιας εφαρμογής χωρίς προσαρμογή μπορεί να προκαλέσει περιττή ανάκτηση δεδομένων και να επιδεινώσει το πρόβλημα N+1. Τα ερωτήματα που δεν βελτιστοποιούνται για συγκεκριμένες περιπτώσεις χρήσης ενδέχεται να λαμβάνουν ελλιπή δεδομένα, προκαλώντας πρόσθετες ερωτήσεις για τη λήψη σχετικών πληροφοριών αργότερα [8].

** 4. ΜΗ ΧΡΗΣΙΜΟΠΟΙΗΣΗ ΤΕΧΝΙΚΕΣ ΦΟΡΤΩΣΗΣ ή ΤΕΧΝΙΚΕΣ ΕΡΩΤΗΣΗΣ
Η αποτυχία να χρησιμοποιήσετε την πρόθυμη φόρτωση (που σχετίζονται με τα δεδομένα που σχετίζονται με το αρχικό ερώτημα) ή οι βελτιστοποιημένες συνδέσεις έχουν ως αποτέλεσμα πολλαπλές στρογγυλές δίσκους στη βάση δεδομένων. Αυτό συμβαίνει όταν οι προγραμματιστές δεν καθοδηγούν ρητά το ORM ή το Query Builder για να φορτώσουν τις σχετικές οντότητες μαζί, οδηγώντας σε πολλά μικρά ερωτήματα αντί για ένα μόνο, αποτελεσματικό [5] [6] [7].

** 5. Αγνοώντας την επίδραση πολλαπλών στρογγυλών στη βάση δεδομένων
Οι προγραμματιστές μερικές φορές υποθέτουν ότι πολλά μικρά ερωτήματα είναι ταχύτερα από ένα περίπλοκο ερώτημα, αλλά κάθε ερώτημα περιλαμβάνει λανθάνουσα κατάσταση δικτύου και εναέρια έξοδα επεξεργασίας. Η σωρευτική επίδραση των ερωτημάτων N+1 επιβραδύνει σημαντικά τους χρόνους απόκρισης εφαρμογής και αυξάνει το φορτίο της βάσης δεδομένων, ειδικά καθώς ο όγκος δεδομένων αυξάνεται [1] [3] [5].

** 6. Έλλειψη ευαισθητοποίησης ή ανίχνευση του προβλήματος
Επειδή κάθε μεμονωμένο ερώτημα στο μοτίβο N+1 τρέχει γρήγορα, συχνά δεν εμφανίζεται σε αργούς κούτσουρες ερωτημάτων ή εργαλεία παρακολούθησης, καθιστώντας το σιωπηλό δολοφόνο απόδοσης. Οι προγραμματιστές ενδέχεται να μην παρατηρήσουν το πρόβλημα έως ότου η ανταπόκριση της εφαρμογής υποβαθμιστεί σημαντικά [2] [5] [7].

Συνοπτικά, το πρόβλημα του ερωτήματος N+1 προκύπτει κυρίως λόγω των αναποτελεσματικών προτύπων λήψης δεδομένων, ειδικά, της αναζήτησης σχετικών δεδομένων σε ξεχωριστά ερωτήματα για κάθε εγγραφή αντί για την παρτίδα ή την ένωση ερωτημάτων. Αυτό προκαλείται συχνά από προεπιλογή τεμπέλης φόρτωσης σε ORMS, αποτυχία χρήσης πρόθυμων φόρτωσης ή παρτίδας και επαναχρησιμοποίηση γενικών ερωτημάτων χωρίς βελτιστοποίηση. Το αποτέλεσμα είναι υπερβολικές στρογγυλές βάσης δεδομένων που υποβαθμίζουν την απόδοση και την επεκτασιμότητα [1] [2] [3] [5] [6] [7].

Αναφορές:
[1] https://planetscale.com/blog/what-is-n-1-query-problem-and-how-to-solve-it
[2] https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem-in-orm-bject-relational-χαρτογράφηση
[3] https://www.pingcap.com/article/how-to-effectly-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-detect-it/
[6] https://www.linkedin.com/posts/aftab-ahmed-bb002827_avoiding-the-n1-query-problem-a-common-activity-7270527662970818561-zmz6
[7] https://dev.to/lovestaco/the-n1-query-problem-the-silent-performance-killer-2b1c
[8] https://www.okoone.com/spark/technology-innovation/avoid-these-7-sql-mistakes-for-better-database-management/