Προγραμματισμός

SQL unleashed: 17 τρόποι για να επιταχύνετε τα ερωτήματά σας SQL

Οι προγραμματιστές SQL σε κάθε πλατφόρμα αγωνίζονται, φαινομενικά κολλημένοι σε ένα ΚΑΝΤΕ ΟΛΟ βρόχο που τους κάνει να επαναλαμβάνουν τα ίδια λάθη ξανά και ξανά. Αυτό συμβαίνει επειδή το πεδίο της βάσης δεδομένων εξακολουθεί να είναι σχετικά ανώριμο. Σίγουρα, οι προμηθευτές κάνουν κάποια βήματα, αλλά συνεχίζουν να αντιμετωπίζουν τα μεγαλύτερα ζητήματα. Ταυτόχρονα, διαχείριση πόρων, διαχείριση χώρου και ταχύτητα εξακολουθούν να μαστίζουν τους προγραμματιστές SQL είτε κωδικοποιούν σε SQL Server, Oracle, DB2, Sybase, MySQL ή οποιαδήποτε άλλη σχετική πλατφόρμα.

Μέρος του προβλήματος είναι ότι δεν υπάρχει μαγική σφαίρα και για σχεδόν κάθε βέλτιστη πρακτική, μπορώ να σας δείξω τουλάχιστον μία εξαίρεση. Συνήθως, ένας προγραμματιστής βρίσκει τις δικές του αγαπημένες μεθόδους - αν και συνήθως δεν περιλαμβάνει κατασκευές για απόδοση ή ταυτόχρονη χρήση - και δεν ενοχλεί να εξερευνήσει άλλες επιλογές. Ίσως αυτό είναι ένα σύμπτωμα έλλειψης εκπαίδευσης ή οι προγραμματιστές είναι πολύ κοντά στη διαδικασία για να αναγνωρίσουν πότε κάνουν κάτι λάθος. Ίσως το ερώτημα να τρέχει καλά σε ένα τοπικό σύνολο δεδομένων δοκιμής, αλλά αποτυγχάνει άσχημα στο σύστημα παραγωγής.

Δεν περιμένω ότι οι προγραμματιστές SQL θα γίνουν διαχειριστές, αλλά πρέπει να λάβουν υπόψη τα προβλήματα παραγωγής κατά τη σύνταξη του κώδικα τους. Εάν δεν το κάνουν κατά την αρχική ανάπτυξη, τα DBA θα τα κάνουν να επιστρέψουν και να το κάνουν αργότερα - και οι χρήστες υποφέρουν στο μεταξύ.

Υπάρχει ένας λόγος για τον οποίο λέμε ότι η ρύθμιση μιας βάσης δεδομένων είναι τέχνη και επιστήμη. Επειδή υπάρχουν πολύ λίγοι σκληροί και γρήγοροι κανόνες που ισχύουν γενικά. Τα προβλήματα που έχετε επιλύσει σε ένα σύστημα δεν είναι προβλήματα σε ένα άλλο και το αντίστροφο. Δεν υπάρχει σωστή απάντηση όσον αφορά τον συντονισμό των ερωτημάτων, αλλά αυτό δεν σημαίνει ότι πρέπει να σταματήσετε.

Υπάρχουν μερικές καλές αρχές που μπορείτε να ακολουθήσετε και θα πρέπει να αποφέρουν αποτελέσματα σε έναν συνδυασμό ή στον άλλο. Τους έχω ενσωματώσει σε μια λίστα SQL dos και δεν πρέπει να παραβλέπονται ή είναι δύσκολο να εντοπιστούν. Αυτές οι τεχνικές θα σας δώσουν λίγο περισσότερη εικόνα για το μυαλό των DBA σας, καθώς και την ικανότητα να αρχίσετε να σκέφτεστε τις διαδικασίες με τρόπο παραγωγής.

1. Μη χρησιμοποιείτε ΕΚΣΥΓΧΡΟΝΙΖΩ αντί ΥΠΟΘΕΣΗ

Αυτό το ζήτημα είναι πολύ κοινό και παρόλο που δεν είναι δύσκολο να εντοπιστεί, πολλοί προγραμματιστές το παραβλέπουν συχνά επειδή χρησιμοποιούν ΕΚΣΥΓΧΡΟΝΙΖΩ έχει ένα φυσικό ow που φαίνεται λογικό.

Πάρτε αυτό το σενάριο, για παράδειγμα: Εισάγετε δεδομένα σε έναν πίνακα θερμοκρασίας και το χρειάζεστε για να εμφανίσετε μια συγκεκριμένη τιμή εάν υπάρχει άλλη τιμή. Ίσως τραβάτε από τον πίνακα πελατών και θέλετε κάποιον με παραγγελίες άνω των 100.000 $ να επισημανθεί ως "Προτιμώμενη". Έτσι, εισάγετε τα δεδομένα στον πίνακα και εκτελείτε ένα ΕΚΣΥΓΧΡΟΝΙΖΩ δήλωση για να ορίσετε τη στήλη CustomerRank σε "Προτιμώμενη" για όσους έχουν περισσότερες από 100.000 $ σε παραγγελίες. Το πρόβλημα είναι ότι το ΕΚΣΥΓΧΡΟΝΙΖΩ Η δήλωση καταγράφεται, πράγμα που σημαίνει ότι πρέπει να γράφει δύο φορές για κάθε εγγραφή στον πίνακα. Ο τρόπος γύρω από αυτό, φυσικά, είναι να χρησιμοποιήσετε ένα inline ΥΠΟΘΕΣΗ δήλωση στο ίδιο το ερώτημα SQL. Αυτό ελέγχει κάθε σειρά για την κατάσταση του ποσού της παραγγελίας και ορίζει την ετικέτα "Προτιμώμενη" προτού να γραφτεί στον πίνακα. Η αύξηση της απόδοσης μπορεί να είναι εκπληκτική.

2. Μην επαναχρησιμοποιείτε τυφλά τον κωδικό

Αυτό το ζήτημα είναι επίσης πολύ κοινό. Είναι πολύ εύκολο να αντιγράψετε τον κωδικό κάποιου άλλου επειδή γνωρίζετε ότι αντλεί τα δεδομένα που χρειάζεστε. Το πρόβλημα είναι ότι αρκετά συχνά αντλεί πολύ περισσότερα δεδομένα από ό, τι χρειάζεστε και οι προγραμματιστές σπάνια ενοχλούν να τα κόβουν, οπότε καταλήγουν σε ένα τεράστιο υπερσύνολο δεδομένων. Αυτό συνήθως έρχεται με τη μορφή ενός επιπλέον εξωτερικού συνδέσμου ή μιας επιπλέον κατάστασης στο ΟΠΟΥ ρήτρα. Μπορείτε να επιτύχετε τεράστια κέρδη απόδοσης εάν μειώσετε τον επαναχρησιμοποιημένο κώδικα στις ακριβείς ανάγκες σας.

3. Τραβήξτε μόνο τον αριθμό των στηλών που χρειάζεστε

Αυτό το ζήτημα είναι παρόμοιο με το τεύχος αρ. 2, αλλά αφορά συγκεκριμένα τις στήλες. Είναι πολύ εύκολο να κωδικοποιήσετε όλα τα ερωτήματά σας ΕΠΙΛΟΓΗ * αντί να καταχωρίσετε τις στήλες ξεχωριστά. Το πρόβλημα και πάλι είναι ότι τραβά περισσότερα δεδομένα από ό, τι χρειάζεστε. Έχω δει αυτό το σφάλμα δεκάδες και δεκάδες φορές. Ένας προγραμματιστής κάνει ένα ΕΠΙΛΟΓΗ * ερώτημα σε έναν πίνακα με 120 στήλες και εκατομμύρια σειρές, αλλά καταλήγει χρησιμοποιώντας μόνο τρεις έως πέντε από αυτές. Σε αυτό το σημείο, επεξεργάζεστε πολύ περισσότερα δεδομένα από όσα χρειάζεστε, είναι περίεργο που το ερώτημα επιστρέφει καθόλου. Δεν επεξεργάζεστε μόνο περισσότερα δεδομένα από όσα χρειάζεστε, αλλά επίσης αφαιρείτε πόρους από άλλες διαδικασίες.

4. Μην κάνετε διπλή βουτιά

Εδώ είναι ένα άλλο που έχω δει περισσότερες φορές από ό, τι έπρεπε: Μια αποθηκευμένη διαδικασία γράφεται για να τραβήξετε δεδομένα από έναν πίνακα με εκατοντάδες εκατομμύρια σειρές. Ο προγραμματιστής χρειάζεται πελάτες που ζουν στην Καλιφόρνια και έχουν εισόδημα άνω των 40.000 $. Έτσι ερωτά για πελάτες που ζουν στην Καλιφόρνια και βάζει τα αποτελέσματα σε έναν πίνακα θερμοκρασίας. Στη συνέχεια, ερωτά για πελάτες με εισόδημα άνω των 40.000 $ και βάζει αυτά τα αποτελέσματα σε έναν άλλο πίνακα. Τέλος, ενώνει και τα δύο τραπέζια για να πάρει το τελικό προϊόν.

Με δουλεύεις? Αυτό πρέπει να γίνει σε ένα μόνο ερώτημα. Αντ 'αυτού, ρίχνετε διπλό σούπερ τραπέζι. Μην είστε ανόητοι: Ερωτήστε μεγάλα τραπέζια μόνο μία φορά όποτε είναι δυνατόν - θα βρείτε πόσο καλύτερη είναι η απόδοση των διαδικασιών σας.

Ένα ελαφρώς διαφορετικό σενάριο είναι όταν ένα υποσύνολο ενός μεγάλου πίνακα απαιτείται από πολλά βήματα σε μια διαδικασία, γεγονός που προκαλεί τον μεγάλο πίνακα να υποβάλλεται σε ερώτηση κάθε φορά. Αποφύγετε αυτό ζητώντας το υποσύνολο και επιμένοντάς το αλλού και, στη συνέχεια, δείχνοντας τα επόμενα βήματα στο μικρότερο σύνολο δεδομένων σας.

6. Κάνετε δεδομένα πριν από το στάδιο

Αυτό είναι ένα από τα αγαπημένα μου θέματα γιατί είναι μια παλιά τεχνική που συχνά παραβλέπεται. Εάν έχετε μια αναφορά ή μια διαδικασία (ή καλύτερα ακόμα, ένα σύνολο από αυτά) που θα κάνει παρόμοιες συνδέσεις με μεγάλους πίνακες, μπορεί να είναι πλεονέκτημα για εσάς να προ-εκθέσετε τα δεδομένα ενώνοντας τους πίνακες εκ των προτέρων και επιμένοντας τους σε ένα τραπέζι. Τώρα οι αναφορές μπορούν να τρέξουν σε αυτόν τον προκατασκευασμένο πίνακα και να αποφύγουν τη μεγάλη συμμετοχή.

Δεν μπορείτε πάντα να χρησιμοποιήσετε αυτήν την τεχνική, αλλά όταν μπορείτε, θα διαπιστώσετε ότι είναι ένας εξαιρετικός τρόπος εξοικονόμησης πόρων διακομιστή.

Λάβετε υπόψη ότι πολλοί προγραμματιστές αντιμετωπίζουν αυτό το πρόβλημα συμμετοχής επικεντρώνοντας το ίδιο το ερώτημα και δημιουργώντας μόνο μια προβολή γύρω από τη σύνδεση, ώστε να μην χρειάζεται να πληκτρολογούν ξανά τις προϋποθέσεις συμμετοχής. Αλλά το πρόβλημα με αυτήν την προσέγγιση είναι ότι το ερώτημα εξακολουθεί να εκτελείται για κάθε αναφορά που τη χρειάζεται. Προπαρασκευάζοντας τα δεδομένα, εκτελείτε τη συμμετοχή μόλις μία φορά (ας πούμε, 10 λεπτά πριν από τις αναφορές) και όλοι οι άλλοι αποφεύγουν τη μεγάλη συμμετοχή. Δεν μπορώ να σας πω πόσο μου αρέσει αυτή η τεχνική. στα περισσότερα περιβάλλοντα, υπάρχουν δημοφιλή τραπέζια που συμμετέχουν συνεχώς, επομένως δεν υπάρχει κανένας λόγος για τον οποίο δεν μπορούν να προπαρασκευαστούν.

7. Διαγράψτε και ενημερώστε σε παρτίδες

Ακολουθεί μια άλλη εύκολη τεχνική που παραβλέπεται πολύ. Η διαγραφή ή η ενημέρωση μεγάλου όγκου δεδομένων από τεράστιους πίνακες μπορεί να είναι ένας εφιάλτης αν δεν το κάνετε σωστά. Το πρόβλημα είναι ότι και οι δύο αυτές δηλώσεις εκτελούνται ως μία μόνο συναλλαγή και εάν πρέπει να τις σκοτώσετε ή εάν συμβεί κάτι στο σύστημα ενώ λειτουργεί, το σύστημα πρέπει να επαναφέρει ολόκληρη τη συναλλαγή. Αυτό μπορεί να διαρκέσει πολύ χρόνο. Αυτές οι λειτουργίες μπορούν επίσης να μπλοκάρουν άλλες συναλλαγές για τη διάρκειά τους, ουσιαστικά συμφόρηση του συστήματος.

Η λύση είναι να κάνετε διαγραφές ή ενημερώσεις σε μικρότερες παρτίδες. Αυτό λύνει το πρόβλημά σας με δύο τρόπους. Πρώτον, εάν η συναλλαγή σκοτωθεί για οποιονδήποτε λόγο, έχει μόνο έναν μικρό αριθμό σειρών για επαναφορά, έτσι η βάση δεδομένων επιστρέφει στο διαδίκτυο πολύ πιο γρήγορα. Δεύτερον, ενώ οι μικρότερες παρτίδες δεσμεύονται στο δίσκο, άλλοι μπορούν να γλιστρήσουν και να κάνουν κάποια δουλειά, οπότε η ταυτόχρονη ενίσχυση ενισχύεται σημαντικά

Σε αυτό το πλαίσιο, πολλοί προγραμματιστές έχουν κολλήσει στο μυαλό τους ότι αυτές οι εργασίες διαγραφής και ενημέρωσης πρέπει να ολοκληρωθούν την ίδια μέρα. Αυτό δεν ισχύει πάντα, ειδικά αν αρχειοθετείτε. Μπορείτε να επεκτείνετε αυτήν τη λειτουργία όσο χρειάζεται, και οι μικρότερες παρτίδες βοηθούν να το επιτύχετε. Εάν μπορεί να χρειαστεί περισσότερο χρόνο για να κάνετε αυτές τις εντατικές λειτουργίες, αφιερώστε τον επιπλέον χρόνο και μην κατεβάσετε το σύστημά σας.

8. Χρησιμοποιήστε πίνακες temp για να βελτιώσετε την απόδοση του δρομέα

Ελπίζω ότι όλοι γνωρίζουμε τώρα ότι είναι καλύτερο να μείνετε μακριά από τους δρομείς αν είναι δυνατόν. Οι δρομείς όχι μόνο υποφέρουν από προβλήματα ταχύτητας, τα οποία από μόνα τους μπορεί να είναι ένα πρόβλημα με πολλές λειτουργίες, αλλά μπορούν επίσης να προκαλέσουν τη λειτουργία του μπλοκαρίσματος άλλων λειτουργιών για πολύ περισσότερο από ό, τι είναι απαραίτητο. Αυτό μειώνει σημαντικά την ταυτόχρονη λειτουργία στο σύστημά σας.

Ωστόσο, δεν μπορείτε πάντα να αποφύγετε τη χρήση δρομέων και όταν προκύψουν αυτές οι στιγμές, ενδέχεται να μπορείτε να ξεφύγετε από ζητήματα απόδοσης που προκαλούνται από τον κέρσορα, κάνοντας τις λειτουργίες του δρομέα ενάντια σε έναν πίνακα θερμοκρασίας. Πάρτε, για παράδειγμα, έναν δρομέα που περνάει από έναν πίνακα και ενημερώνει μερικές στήλες με βάση ορισμένα αποτελέσματα σύγκρισης. Αντί να κάνετε τη σύγκριση με τον ζωντανό πίνακα, ίσως μπορείτε να βάλετε αυτά τα δεδομένα σε έναν προσωρινό πίνακα και να κάνετε τη σύγκριση με αυτό. Τότε έχετε ένα single ΕΚΣΥΓΧΡΟΝΙΖΩ δήλωση ενάντια στο ζωντανό τραπέζι που είναι πολύ μικρότερο και κρατά κλειδώματα μόνο για μικρό χρονικό διάστημα.

Η αποκοπή των τροποποιήσεων δεδομένων σας όπως αυτό μπορεί να αυξήσει σημαντικά την ταυτόχρονη. Θα τελειώσω λέγοντας ότι σχεδόν ποτέ δεν χρειάζεται να χρησιμοποιήσετε δρομέα. Υπάρχει σχεδόν πάντα μια λύση που βασίζεται σε σύνολο. πρέπει να μάθετε να το βλέπετε.

9. Μην φωλιάζετε προβολές

Οι προβολές μπορεί να είναι βολικές, αλλά πρέπει να είστε προσεκτικοί όταν τις χρησιμοποιείτε. Ενώ οι προβολές μπορούν να βοηθήσουν στην απόκρυψη μεγάλων ερωτημάτων από τους χρήστες και στην τυποποίηση της πρόσβασης δεδομένων, μπορείτε εύκολα να βρεθείτε σε μια κατάσταση όπου έχετε προβολές που προβάλλουν κλήσεις που καλούν προβολές που καλούν προβολές. Αυτό ονομάζεται φωλιέςκαι μπορεί να προκαλέσει σοβαρά προβλήματα απόδοσης, ιδίως με δύο τρόπους:

  • Πρώτον, πιθανότατα θα έχετε πολύ περισσότερα δεδομένα να επιστρέφουν από ό, τι χρειάζεστε.
  • Δεύτερον, το εργαλείο βελτιστοποίησης ερωτήσεων θα παραιτηθεί και θα επιστρέψει ένα κακό πρόγραμμα ερωτήσεων.

Κάποτε είχα έναν πελάτη που του άρεσε πολύ η θέα. Ο πελάτης είχε μια άποψη που χρησιμοποιούσε για σχεδόν όλα, επειδή είχε δύο σημαντικές συνδέσεις. Το πρόβλημα ήταν ότι η προβολή επέστρεψε μια στήλη με 2MB έγγραφα σε αυτήν. Μερικά από τα έγγραφα ήταν ακόμη μεγαλύτερα. Ο πελάτης προωθούσε τουλάχιστον ένα επιπλέον 2MB στο δίκτυο για κάθε σειρά σε σχεδόν κάθε ερώτημα που έτρεξε. Φυσικά, η απόδοση του ερωτήματος ήταν απαίσια.

Και κανένα από τα ερωτήματα δεν χρησιμοποίησε πραγματικά αυτήν τη στήλη! Φυσικά, η στήλη θάφτηκε σε βάθος επτά προβολών, οπότε ήταν δύσκολο να βρεθεί. Όταν κατάργησα τη στήλη του εγγράφου από την προβολή, ο χρόνος για το μεγαλύτερο ερώτημα πέρασε από 2,5 ώρες σε 10 λεπτά. Όταν τελικά αποκάλυψα τις ένθετες προβολές, οι οποίες είχαν πολλές περιττές συνδέσεις και στήλες και έγραψα ένα απλό ερώτημα, ο χρόνος για το ίδιο ερώτημα έπεσε στα δευτερόλεπτα.