Τα κοινά σημάδια του προβλήματος ερωτήματος N+1 περιλαμβάνουν τους ακόλουθους λεπτομερείς δείκτες:
- Υπερβολικός αριθμός ερωτημάτων: Το πιο προφανές σημάδι είναι ότι η εφαρμογή σας εκτελεί πολλά περισσότερα ερωτήματα βάσεων δεδομένων από το αναμενόμενο. Συνήθως, βλέπετε ένα αρχικό ερώτημα για να φέρετε μια λίστα αρχείων, ακολουθούμενη από ένα πρόσθετο ερώτημα για κάθε εγγραφή για να λάβετε σχετικά δεδομένα. Για παράδειγμα, η ανάληψη 10 χρηστών και στη συνέχεια η εκτέλεση 10 ξεχωριστών ερωτημάτων για να πάρει τις αναρτήσεις κάθε χρήστη έχει ως αποτέλεσμα 11 ερωτήματα αντί για ένα μόνο βελτιστοποιημένο ερώτημα [1] [3].
- Οι αργοί χρόνοι απόκρισης εφαρμογής: Επειδή κάθε ερώτημα απαιτεί ένα ταξίδι μετ 'επιστροφής στη βάση δεδομένων, το σωρευτικό αποτέλεσμα πολλών μικρών ερωτημάτων επιβραδύνει σημαντικά την ανάκτηση δεδομένων. Αυτό οδηγεί σε βραδύτερα φορτία σελίδας ή απαντήσεις API, καθιστώντας την εφαρμογή λιγότερο ανταποκρινόμενη στα αιτήματα των χρηστών [1] [5].
- Υψηλή φόρτωση βάσης δεδομένων: Ο διακομιστής βάσης δεδομένων παρουσιάζει αυξημένο φορτίο λόγω του μεγάλου αριθμού ερωτημάτων, οι οποίοι μπορούν να επιταχύνουν τους πόρους και να μειώσουν τη συνολική απόδοση του συστήματος. Αυτό μπορεί να υποβαθμίσει την απόδοση και να περιορίσει την επεκτασιμότητα καθώς ο αριθμός των χρηστών ή των δεδομένων αυξάνεται [3] [5] [6].
- Αόρατο σε αργό κούτσουρα ερωτημάτων: Σε αντίθεση με ένα μόνο αργό ερώτημα, το πρόβλημα N+1 συχνά παραμένει απαρατήρητο σε αργό κούτσουρα ερωτήσεων, επειδή κάθε μεμονωμένο ερώτημα τρέχει γρήγορα. Ωστόσο, η συνολική επίδραση πολλών ερωτημάτων προκαλεί υποβάθμιση της απόδοσης [2].
- Απροσδόκητα ή κρυμμένα ερωτήματα που προκλήθηκαν από το ORM: Όταν χρησιμοποιείτε αντικειμενικά πλαίσια χαρτογράφησης (ORM), το πρόβλημα N+1 προκύπτει συχνά λόγω τεμπέλης φόρτωσης ή εσφαλμένης διαμόρφωσης. Η πρόσβαση σε σχετικές οντότητες σε ένα βρόχο μπορεί να προκαλέσει πρόσθετα ερωτήματα χωρίς ρητές κλήσεις στον κώδικα, καθιστώντας δύσκολο να ανιχνευθεί μόνο εξετάζοντας τον πηγαίο κώδικα [2] [5] [6].
- BottleNecks Performance σε πρότυπα λήψης δεδομένων: Εάν η εφαρμογή σας έχει σύνθετες σχέσεις αντικειμένων και μεταφέρει τα σχετικά δεδομένα σε πολλαπλά βήματα και όχι σε ένα ενιαίο βελτιστοποιημένο ερώτημα, αυτό το πρότυπο είναι ένας ισχυρός δείκτης του προβλήματος N+1 [6].
Συνοπτικά, τα κοινά σημάδια είναι ένας απροσδόκητα υψηλός αριθμός ερωτημάτων βάσεων δεδομένων για το τι πρέπει να είναι μια απλή ανάκτηση δεδομένων, οι αργοί χρόνοι απόκρισης λόγω πολλαπλών εκδρομών μετ 'επιστροφής βάσης δεδομένων, αυξημένο φορτίο στον διακομιστή βάσης δεδομένων και δυσκολία εντοπισμού του προβλήματος, επειδή κάθε ερώτημα εκφράζει μεμονωμένα γρήγορα αλλά συλλογικά καθυστερήσεις. Αυτά τα συμπτώματα είναι ιδιαίτερα διαδεδομένα σε εφαρμογές χρησιμοποιώντας 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.neurelo.com/post/what-is-the-n-1-query-problem
[7] https://dev.to/lovestaco/the-n1-query-problem-the-silent-performance-killer-2b1c
[8] https://www.pullrequest.com/blog/avoiding-n-1-database-queries-in-asp-net-a-practical-guide/