1. Για να βελτιστοποιήσετε το ερώτημα, θα πρέπει να προσπαθήσετε να αποφύγετε την πλήρη σάρωση πίνακα και πρώτα να σκεφτείτε να δημιουργήσετε ένα ευρετήριο για τις στήλες που εμπλέκονται στο πού και τη σειρά.
2. Προσπαθήστε να αποφύγετε την κρίση μηδενικής τιμής στα πεδία της ρήτρας where, διαφορετικά θα αναγκάσει τη μηχανή να εγκαταλείψει τη χρήση ευρετηρίων και να εκτελέσει πλήρη σάρωση πίνακα, όπως:
Επιλέξτε αναγνωριστικό από το T όπου ο αριθμός είναι μηδενικός
Μπορείτε να ορίσετε την προεπιλεγμένη τιμή 0 στο num, να βεβαιωθείτε ότι δεν υπάρχει μηδενική τιμή στη στήλη num στον πίνακα και, στη συνέχεια, να υποβάλετε ερώτημα ως εξής:
Επιλέξτε αναγνωριστικό από το T όπου NUM=0
3. Προσπαθήστε να αποφύγετε τη χρήση τελεστών != ή <> στην ρήτρα where, διαφορετικά ο κινητήρας θα εγκαταλείψει τη χρήση ευρετηρίων και θα εκτελέσει σάρωση πλήρους πίνακα.
4. Θα πρέπει να προσπαθήσετε να αποφύγετε τη χρήση της ρήτρας OR in the where για να ενώσετε τη συνθήκη, διαφορετικά θα αναγκάσει τη μηχανή να εγκαταλείψει τη χρήση ευρετηρίων και να εκτελέσει μια πλήρη σάρωση πίνακα, όπως:
Επιλέξτε αναγνωριστικό από το T όπου NUM=10 ή NUM=20
Μπορείτε να ρωτήσετε ως εξής:
Επιλέξτε αναγνωριστικό από το T όπου NUM=10
Ένωση Όλα
επιλέξτε id από t όπου num=20
5.in και όχι μέσα θα πρέπει επίσης να χρησιμοποιούνται με προσοχή, διαφορετικά θα οδηγήσει σε πλήρη σάρωση πίνακα, όπως:
Επιλέξτε αναγνωριστικό από το t όπου num in(1,2,3)
Για συνεχείς τιμές, μην χρησιμοποιείτε το in εάν μπορείτε να χρησιμοποιήσετε μεταξύ:
Επιλέξτε αναγνωριστικό από το T όπου αριθμός μεταξύ 1 και 3
6. Το ακόλουθο ερώτημα θα έχει επίσης ως αποτέλεσμα μια πλήρη σάρωση πίνακα:
Επιλέξτε αναγνωριστικό από το t όπου όνομα όπως "%abc%"
Για να βελτιώσετε την αποτελεσματικότητα, εξετάστε την αναζήτηση πλήρους κειμένου.
7. Εάν χρησιμοποιήσετε μια παράμετρο σε έναν όρο where, θα προκαλέσει επίσης σάρωση πλήρους πίνακα. Επειδή η SQL επιλύει μόνο τοπικές μεταβλητές κατά το χρόνο εκτέλεσης, αλλά ο βελτιστοποιητής δεν μπορεί να αναβάλει την επιλογή των σχεδίων πρόσβασης στο χρόνο εκτέλεσης. Πρέπει να επιλεγεί κατά τη στιγμή της μεταγλώττισης. Ωστόσο, εάν δημιουργηθεί ένα σχέδιο πρόσβασης κατά τη στιγμή της μεταγλώττισης, η τιμή της μεταβλητής εξακολουθεί να είναι άγνωστη και επομένως δεν μπορεί να χρησιμοποιηθεί ως στοιχείο εισόδου για την επιλογή ευρετηρίου. Οι ακόλουθες δηλώσεις θα σαρωθούν πλήρως:
Επιλέξτε αναγνωριστικό από το t όπου num=@num
Μπορείτε να επιβάλετε στο ερώτημα να χρησιμοποιήσει ένα ευρετήριο:
Επιλέξτε αναγνωριστικό από το T With(Index(Index(Index Name)) όπου Num=@num
8. Προσπαθήστε να αποφύγετε την έκφραση πεδίων στη ρήτρα where, η οποία θα αναγκάσει τη μηχανή να εγκαταλείψει τη χρήση ευρετηρίων υπέρ της πλήρους σάρωσης πίνακα. Για παράδειγμα:
Επιλέξτε αναγνωριστικό από το T όπου NUM/2=100
θα πρέπει να αλλάξει σε:
Επιλέξτε αναγνωριστικό από το T όπου NUM=100*2
9. Προσπαθήστε να αποφύγετε την εκτέλεση λειτουργιών συνάρτησης σε πεδία της ρήτρας where, κάτι που θα αναγκάσει τον κινητήρα να εγκαταλείψει τη χρήση ευρετηρίων υπέρ της πλήρους σάρωσης πίνακα. Για παράδειγμα:
Επιλέξτε αναγνωριστικό από το t όπου substring(όνομα,1,3)='abc' --αναγνωριστικό ονόματος που ξεκινά με abc
Επιλέξτε αναγνωριστικό από το T όπου δημιουργήθηκε το αναγνωριστικό datediff(day,createdate,'2005-11-30')=0--'2005-11-30'
θα πρέπει να αλλάξει σε:
Επιλέξτε αναγνωριστικό από το t όπου όνομα όπως "abc%"
Επιλέξτε αναγνωριστικό από το t όπου δημιουργήθηκε>='2005-11-30' και δημιουργήθηκε<'2005-12-1'
10. Μην εκτελείτε συναρτήσεις, αριθμητικές πράξεις ή άλλες πράξεις έκφρασης στα αριστερά του "=" στην πρόταση where, διαφορετικά το σύστημα ενδέχεται να μην μπορεί να χρησιμοποιήσει σωστά το ευρετήριο.
11. Όταν χρησιμοποιείτε ένα πεδίο ευρετηρίου ως συνθήκη, εάν το ευρετήριο είναι σύνθετο ευρετήριο, τότε το πρώτο πεδίο στο ευρετήριο πρέπει να χρησιμοποιείται ως συνθήκη για να διασφαλιστεί ότι το σύστημα χρησιμοποιεί το ευρετήριο, διαφορετικά το ευρετήριο δεν θα χρησιμοποιηθεί και η σειρά των πεδίων θα πρέπει να είναι συνεπής με τη σειρά ευρετηρίου όσο το δυνατόν περισσότερο.
12. Μην γράφετε κάποια ερωτήματα χωρίς νόημα, όπως η δημιουργία μιας κενής δομής πίνακα:
επιλέξτε col1,col2 σε #t από t όπου 1=0
Αυτός ο τύπος κώδικα δεν επιστρέφει κανένα σύνολο αποτελεσμάτων, αλλά καταναλώνει πόρους συστήματος, επομένως θα πρέπει να αλλάξει σε κάτι σαν αυτό:
Δημιουργία πίνακα #t(...)
13. Πολλές φορές είναι καλή επιλογή να αντικατασταθεί με υπάρχει:
Επιλέξτε Num από το A όπου Num In(Επιλέξτε Num από το B)
Να αντικατασταθεί με την ακόλουθη δήλωση:
Επιλέξτε Num από το A όπου υπάρχει(επιλέξτε 1 από το B όπου num=a.num)
14. Δεν είναι όλα τα ευρετήρια έγκυρα για ερωτήματα, η SQL βασίζεται στα δεδομένα του πίνακα για τη βελτιστοποίηση του ερωτήματος, όταν η στήλη ευρετηρίου έχει μεγάλο όγκο διπλότυπων δεδομένων, τα ερωτήματα SQL ενδέχεται να μην χρησιμοποιούν το ευρετήριο, όπως ένας πίνακας έχει φύλο πεδίου, αρσενικό, θηλυκό είναι σχεδόν το μισό το καθένα, τότε ακόμα κι αν το ευρετήριο βασίζεται στο φύλο, δεν θα παίξει ρόλο στην αποτελεσματικότητα του ερωτήματος.
15. Όσο περισσότερα ευρετήρια δεν είναι τόσο το καλύτερο, το ευρετήριο μπορεί σίγουρα να βελτιώσει την αποτελεσματικότητα της αντίστοιχης επιλογής, αλλά μειώνει επίσης την αποτελεσματικότητα της εισαγωγής και της ενημέρωσης, επειδή το ευρετήριο μπορεί να ξαναχτιστεί κατά την εισαγωγή ή την ενημέρωση, επομένως ο τρόπος δημιουργίας ενός ευρετηρίου πρέπει να εξεταστεί προσεκτικά, ανάλογα με τη συγκεκριμένη κατάσταση. Είναι καλύτερο να μην έχετε περισσότερα από 6 ευρετήρια σε έναν πίνακα και εάν είναι πάρα πολλά, σκεφτείτε εάν είναι απαραίτητο να δημιουργήσετε ευρετήρια σε ορισμένες στήλες που δεν χρησιμοποιούνται συχνά.
16. Αποφύγετε όσο το δυνατόν περισσότερο την ενημέρωση των στηλών δεδομένων ομαδοποιημένου ευρετηρίου, επειδή η σειρά των στηλών δεδομένων ομαδοποιημένου ευρετηρίου είναι η φυσική σειρά αποθήκευσης των εγγραφών πίνακα και μόλις αλλάξει η τιμή της στήλης, θα οδηγήσει στην προσαρμογή της σειράς ολόκληρων των εγγραφών του πίνακα, η οποία θα καταναλώσει σημαντικούς πόρους. Εάν η εφαρμογή σας χρειάζεται να ενημερώνει συχνά τις στήλες ομαδοποιημένου ευρετηρίου, πρέπει να εξετάσετε εάν πρέπει να δημιουργήσετε το ευρετήριο ως ομαδοποιημένο ευρετήριο.
17. Προσπαθήστε να χρησιμοποιήσετε αριθμητικά πεδία και προσπαθήστε να μην σχεδιάζετε πεδία που περιέχουν μόνο αριθμητικές πληροφορίες ως χαρακτήρες, γεγονός που θα μειώσει την απόδοση των ερωτημάτων και των συνδέσεων και θα αυξήσει τα έξοδα αποθήκευσης. Αυτό συμβαίνει επειδή η μηχανή συγκρίνει κάθε χαρακτήρα στη συμβολοσειρά έναν προς έναν κατά την επεξεργασία ερωτημάτων και ενώσεων, ενώ για αριθμητικούς τύπους, χρειάζεται να συγκριθεί μόνο μία φορά.
18. Χρησιμοποιήστε το varchar/nvarchar αντί για το char/nchar όσο το δυνατόν περισσότερο, γιατί πρώτον, ο μεγαλύτερος χώρος αποθήκευσης πεδίου μπορεί να εξοικονομήσει χώρο αποθήκευσης και, δεύτερον, για ερωτήματα, η αποτελεσματικότητα αναζήτησης σε ένα σχετικά μικρό πεδίο είναι προφανώς υψηλότερη.
19. Μην χρησιμοποιείτε την επιλογή * από t πουθενά, αντικαταστήστε το "*" με μια συγκεκριμένη λίστα πεδίων και μην επιστρέψετε πεδία που δεν χρησιμοποιούνται.
20. Προσπαθήστε να χρησιμοποιήσετε μεταβλητές πίνακα αντί για προσωρινούς πίνακες. Εάν η μεταβλητή πίνακα περιέχει μεγάλο όγκο δεδομένων, σημειώστε ότι το ευρετήριο είναι πολύ περιορισμένο (μόνο το ευρετήριο πρωτεύοντος κλειδιού).
21. Αποφύγετε τη συχνή δημιουργία και διαγραφή προσωρινών πινάκων για να μειώσετε την κατανάλωση πόρων πίνακα συστήματος.
22. Οι προσωρινοί πίνακες δεν μπορούν να χρησιμοποιηθούν και η κατάλληλη χρήση τους μπορεί να κάνει ορισμένες ρουτίνες πιο αποτελεσματικές, για παράδειγμα, όταν χρειάζεται να αναφέρετε επανειλημμένα ένα σύνολο δεδομένων σε έναν μεγάλο πίνακα ή σε έναν πίνακα που χρησιμοποιείται συνήθως. Ωστόσο, για εφάπαξ συμβάντα, είναι καλύτερο να χρησιμοποιήσετε έναν πίνακα εξαγωγής.
23. Κατά τη δημιουργία ενός προσωρινού πίνακα, εάν ο όγκος των δεδομένων που εισάγονται ταυτόχρονα είναι μεγάλος, τότε μπορείτε να χρησιμοποιήσετε την επιλογή αντί για τη δημιουργία πίνακα για να αποφύγετε την πρόκληση μεγάλου αριθμού αρχείων καταγραφής για τη βελτίωση της ταχύτητας. Εάν ο όγκος των δεδομένων δεν είναι μεγάλος, για να διευκολύνετε τους πόρους του πίνακα συστήματος, θα πρέπει πρώτα να δημιουργήσετε πίνακα και μετά να εισαγάγετε.
24. Εάν χρησιμοποιείται προσωρινός πίνακας, φροντίστε να διαγράψετε ρητά όλους τους προσωρινούς πίνακες στο τέλος της αποθηκευμένης διαδικασίας, να περικόψετε πρώτα τον πίνακα και, στη συνέχεια, να αποθέσετε τον πίνακα, ώστε να αποφύγετε το κλείδωμα του πίνακα συστήματος για μεγάλο χρονικό διάστημα.
25. Προσπαθήστε να αποφύγετε τη χρήση του δρομέα, επειδή η απόδοση του δρομέα είναι κακή, εάν τα δεδομένα που λειτουργούν από τον κέρσορα υπερβαίνουν τις 10.000 γραμμές, τότε θα πρέπει να εξετάσετε το ενδεχόμενο να ξαναγράψετε.
26. Θα πρέπει να αναζητηθούν λύσεις που βασίζονται σε σύνολα για την επίλυση προβλημάτων πριν από τη χρήση μεθόδων που βασίζονται σε κέρσορες ή προσωρινών πινάκων, οι οποίες είναι συχνά πιο αποτελεσματικές.
27. Όπως και οι προσωρινοί πίνακες, οι δρομείς δεν μπορούν να χρησιμοποιηθούν. Η χρήση FAST_FORWARD δρομέων για μικρά σύνολα δεδομένων είναι συχνά καλύτερη από άλλες μεθόδους επεξεργασίας γραμμή προς σειρά, ειδικά εάν πρέπει να αναφέρετε πολλούς πίνακες για να λάβετε τα δεδομένα που χρειάζεστε. Οι ρουτίνες που περιλαμβάνουν το "σύνολο" στο σύνολο αποτελεσμάτων είναι συνήθως ταχύτερες από αυτές που εκτελούνται με τον κέρσορα. Εάν ο χρόνος ανάπτυξης το επιτρέπει, μπορείτε να δοκιμάσετε τόσο τις μεθόδους που βασίζονται στον κέρσορα όσο και τις μεθόδους που βασίζονται σε σύνολα για να δείτε ποια λειτουργεί καλύτερα.
28. Ρυθμίστε το SET NOCOUNT ON στην αρχή όλων των αποθηκευμένων διαδικασιών και ενεργοποιητών και το SET NOCOUNT OFF στο τέλος. Δεν χρειάζεται να στείλετε μηνύματα DONE_IN_PROC στον πελάτη μετά την εκτέλεση κάθε δήλωσης της αποθηκευμένης διαδικασίας και ενεργοποίησης.
29. Προσπαθήστε να αποφύγετε μεγάλες συναλλαγές και να βελτιώσετε την ικανότητα συγχρονισμού του συστήματος.
30. Προσπαθήστε να αποφύγετε την επιστροφή μεγάλων δεδομένων στον πελάτη, εάν ο όγκος δεδομένων είναι πολύ μεγάλος, θα πρέπει να εξετάσετε εάν η αντίστοιχη ζήτηση είναι λογική. |