Τι είναι τα ευρετήρια στην sql. SQL - Ευρετήρια. Γιατί τα ευρετήρια συμπλέγματος και μη ονομάζονται B-Tree στον SQL Server;

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

Τα ευρετήρια δημιουργούνται σε στήλες πίνακα και προβολής. Τα ευρετήρια παρέχουν έναν τρόπο γρήγορης αναζήτησης δεδομένων με βάση τις τιμές σε αυτές τις στήλες. Για παράδειγμα, εάν δημιουργήσετε ένα ευρετήριο σε ένα πρωτεύον κλειδί και στη συνέχεια αναζητήσετε μια σειρά δεδομένων χρησιμοποιώντας τις τιμές του πρωτεύοντος κλειδιού, τότε SQL Serverθα βρει πρώτα την τιμή του ευρετηρίου και στη συνέχεια θα χρησιμοποιήσει το ευρετήριο για να βρει γρήγορα ολόκληρη τη σειρά δεδομένων. Χωρίς ευρετήριο, θα πραγματοποιηθεί πλήρης σάρωση όλων των σειρών του πίνακα, η οποία μπορεί να έχει σημαντικό αντίκτυπο στην απόδοση.
Μπορείτε να δημιουργήσετε ένα ευρετήριο στις περισσότερες στήλες σε έναν πίνακα ή μια προβολή. Η εξαίρεση είναι κυρίως στήλες με τύπους δεδομένων για την αποθήκευση μεγάλων αντικειμένων ( ΚΤΥΠΩ ΥΨΗΛΑ ΣΦΑΙΡΑΝ ΤΕΝΙΣ), όπως εικόνα, κείμενοή varchar (μέγιστο). Μπορείτε επίσης να δημιουργήσετε ευρετήρια σε στήλες που έχουν σχεδιαστεί για την αποθήκευση δεδομένων στη μορφή XML, αλλά αυτά τα ευρετήρια έχουν ελαφρώς διαφορετική δομή από τα τυπικά και η εξέτασή τους ξεφεύγει από το πεδίο εφαρμογής αυτού του άρθρου. Επίσης, το άρθρο δεν συζητά κολωνοπωλείοευρετήρια. Αντίθετα, επικεντρώνομαι σε αυτά τα ευρετήρια που χρησιμοποιούνται πιο συχνά σε βάσεις δεδομένων SQL Server.
Ένα ευρετήριο αποτελείται από ένα σύνολο σελίδων, κόμβους ευρετηρίου, οι οποίοι είναι οργανωμένοι σε δομή δέντρου - ισορροπημένο δέντρο. Αυτή η δομή είναι ιεραρχικής φύσης και ξεκινά με έναν κόμβο ρίζας στην κορυφή της ιεραρχίας και τους κόμβους των φύλλων, τα φύλλα, στο κάτω μέρος, όπως φαίνεται στο σχήμα:


Όταν υποβάλλετε ερώτημα σε μια στήλη με ευρετήριο, η μηχανή ερωτημάτων ξεκινά από την κορυφή του ριζικού κόμβου και προχωρά προς τα κάτω μέσω των ενδιάμεσων κόμβων, με κάθε ενδιάμεσο επίπεδο να περιέχει πιο λεπτομερείς πληροφορίες σχετικά με τα δεδομένα. Η μηχανή αναζήτησης συνεχίζει να κινείται μέσω των κόμβων ευρετηρίου μέχρι να φτάσει στο κάτω επίπεδο με τα φύλλα ευρετηρίου. Για παράδειγμα, εάν αναζητάτε την τιμή 123 σε μια στήλη με ευρετήριο, η μηχανή ερωτημάτων θα καθορίσει πρώτα τη σελίδα στο πρώτο ενδιάμεσο επίπεδο στο επίπεδο ρίζας. Σε αυτήν την περίπτωση, η πρώτη σελίδα δείχνει μια τιμή από 1 έως 100 και η δεύτερη από 101 έως 200, επομένως η μηχανή ερωτημάτων θα έχει πρόσβαση στη δεύτερη σελίδα αυτού του ενδιάμεσου επιπέδου. Στη συνέχεια θα δείτε ότι πρέπει να γυρίσετε στην τρίτη σελίδα του επόμενου ενδιάμεσου επιπέδου. Από εδώ, το υποσύστημα ερωτήματος θα διαβάσει την τιμή του ίδιου του ευρετηρίου σε χαμηλότερο επίπεδο. Τα φύλλα ευρετηρίου μπορούν να περιέχουν είτε τα ίδια τα δεδομένα του πίνακα είτε απλώς έναν δείκτη σε σειρές με δεδομένα στον πίνακα, ανάλογα με τον τύπο του ευρετηρίου: ομαδοποιημένο ευρετήριο ή μη ομαδοποιημένο ευρετήριο.

Ομαδοποιημένος δείκτης
Ένα ομαδοποιημένο ευρετήριο αποθηκεύει τις πραγματικές σειρές δεδομένων στα φύλλα του ευρετηρίου. Επιστρέφοντας στο προηγούμενο παράδειγμα, αυτό σημαίνει ότι η σειρά δεδομένων που σχετίζεται με την τιμή κλειδιού 123 θα αποθηκευτεί στο ίδιο το ευρετήριο. Σημαντικό χαρακτηριστικόΈνας ομαδοποιημένος δείκτης είναι ότι όλες οι τιμές ταξινομούνται με συγκεκριμένη σειρά, είτε αύξουσα είτε φθίνουσα. Επομένως, ένας πίνακας ή μια προβολή μπορεί να έχει μόνο ένα ευρετήριο συμπλέγματος. Επιπλέον, θα πρέπει να σημειωθεί ότι τα δεδομένα σε έναν πίνακα αποθηκεύονται σε ταξινομημένη μορφή μόνο εάν έχει δημιουργηθεί ένα ομαδοποιημένο ευρετήριο σε αυτόν τον πίνακα.
Ένας πίνακας που δεν έχει ομαδοποιημένο ευρετήριο ονομάζεται σωρό.
Μη ομαδοποιημένος δείκτης
Σε αντίθεση με έναν ομαδοποιημένο ευρετήριο, τα φύλλα ενός μη ομαδοποιημένου ευρετηρίου περιέχουν μόνο αυτές τις στήλες ( κλειδί) με τον οποίο καθορίζεται αυτός ο δείκτης και περιέχει επίσης έναν δείκτη σε σειρές με πραγματικά δεδομένα στον πίνακα. Αυτό σημαίνει ότι το σύστημα υποερωτημάτων απαιτεί μια πρόσθετη λειτουργία για τον εντοπισμό και την ανάκτηση των απαιτούμενων δεδομένων. Το περιεχόμενο του δείκτη δεδομένων εξαρτάται από τον τρόπο αποθήκευσης των δεδομένων: πίνακας συμπλέγματος ή σωρού. Εάν ένας δείκτης δείχνει σε έναν πίνακα ομαδοποίησης, δείχνει σε ένα συμπλεγμένο ευρετήριο που μπορεί να χρησιμοποιηθεί για την εύρεση των πραγματικών δεδομένων. Εάν ένας δείκτης αναφέρεται σε ένα σωρό, τότε δείχνει σε ένα συγκεκριμένο αναγνωριστικό σειράς δεδομένων. Τα μη συμπλεγματοποιημένα ευρετήρια δεν μπορούν να ταξινομηθούν όπως τα ευρετήρια συμπλέγματος, αλλά μπορείτε να δημιουργήσετε περισσότερα από ένα μη συμπλεγματοποιημένα ευρετήρια σε έναν πίνακα ή προβολή, έως και 999. Αυτό δεν σημαίνει ότι πρέπει να δημιουργήσετε όσο το δυνατόν περισσότερα ευρετήρια. Οι δείκτες μπορούν είτε να βελτιώσουν είτε να υποβαθμίσουν την απόδοση του συστήματος. Εκτός από τη δυνατότητα δημιουργίας πολλαπλών ευρετηρίων χωρίς συμπλέγματα, μπορείτε επίσης να συμπεριλάβετε πρόσθετες στήλες ( περιλαμβανόμενη στήλη) στο ευρετήριό του: τα φύλλα του ευρετηρίου θα αποθηκεύουν όχι μόνο την τιμή των ίδιων των στηλών με ευρετήριο, αλλά και τις τιμές αυτών των μη ευρετηριασμένων πρόσθετων στηλών. Αυτή η προσέγγιση θα σας επιτρέψει να παρακάμψετε ορισμένους από τους περιορισμούς που τίθενται στο ευρετήριο. Για παράδειγμα, μπορείτε να συμπεριλάβετε μια στήλη χωρίς δυνατότητα ευρετηρίου ή να παρακάμψετε το όριο μήκους ευρετηρίου (900 byte στις περισσότερες περιπτώσεις).

Τύποι δεικτών

Εκτός από το ότι είναι ευρετήριο συμπλέγματος ή μη, μπορεί να διαμορφωθεί περαιτέρω ως σύνθετο ευρετήριο, μοναδικό ευρετήριο ή ευρετήριο κάλυψης.
Σύνθετος δείκτης
Ένα τέτοιο ευρετήριο μπορεί να περιέχει περισσότερες από μία στήλες. Μπορείτε να συμπεριλάβετε έως και 16 στήλες σε ένα ευρετήριο, αλλά το συνολικό τους μήκος περιορίζεται στα 900 byte. Τόσο οι ομαδοποιημένοι όσο και οι μη ομαδοποιημένοι δείκτες μπορούν να είναι σύνθετοι.
Μοναδικό ευρετήριο
Αυτό το ευρετήριο διασφαλίζει ότι κάθε τιμή στη στήλη με ευρετήριο είναι μοναδική. Εάν το ευρετήριο είναι σύνθετο, τότε η μοναδικότητα ισχύει για όλες τις στήλες του ευρετηρίου, αλλά όχι για κάθε μεμονωμένη στήλη. Για παράδειγμα, εάν δημιουργήσετε ένα μοναδικό ευρετήριο στις στήλες ΟΝΟΜΑΚαι ΕΠΩΝΥΜΟ, Οτι πλήρες όνομαπρέπει να είναι μοναδικό, αλλά είναι δυνατά τα διπλότυπα στο όνομα ή το επώνυμο.
Ένα μοναδικό ευρετήριο δημιουργείται αυτόματα όταν ορίζετε έναν περιορισμό στήλης: πρωτεύον κλειδί ή περιορισμό μοναδικής τιμής:
  • Πρωτεύων κλειδί
    Όταν ορίζετε έναν περιορισμό πρωτεύοντος κλειδιού σε μία ή περισσότερες στήλες τότε SQL Serverδημιουργεί αυτόματα ένα μοναδικό ευρετήριο συμπλέγματος εάν δεν έχει δημιουργηθεί προηγουμένως ένα ευρετήριο συμπλέγματος (σε αυτήν την περίπτωση, δημιουργείται ένα μοναδικό μη συμπλεγματοποιημένο ευρετήριο στο πρωτεύον κλειδί)
  • Μοναδικότητα αξιών
    Όταν ορίζετε έναν περιορισμό στη μοναδικότητα των αξιών, τότε SQL Serverδημιουργεί αυτόματα ένα μοναδικό μη ομαδοποιημένο ευρετήριο. Μπορείτε να καθορίσετε ότι θα δημιουργηθεί ένα μοναδικό ευρετήριο συμπλέγματος εάν δεν έχει δημιουργηθεί ακόμη ευρετήριο συμπλέγματος στον πίνακα
Ευρετήριο κάλυψης
Ένα τέτοιο ευρετήριο επιτρέπει σε ένα συγκεκριμένο ερώτημα να λάβει αμέσως όλα τα απαραίτητα δεδομένα από τα φύλλα του ευρετηρίου χωρίς πρόσθετη πρόσβαση στις εγγραφές του ίδιου του πίνακα.

Σχεδιασμός Ευρετηρίων

Όσο χρήσιμα και αν είναι τα ευρετήρια, πρέπει να σχεδιάζονται προσεκτικά. Επειδή τα ευρετήρια μπορεί να καταλαμβάνουν σημαντικό χώρο στο δίσκο, δεν θέλετε να δημιουργήσετε περισσότερα ευρετήρια από όσα χρειάζεται. Επιπλέον, τα ευρετήρια ενημερώνονται αυτόματα όταν ενημερώνεται η ίδια η σειρά δεδομένων, γεγονός που μπορεί να οδηγήσει σε επιπλέον έξοδα πόρων και υποβάθμιση της απόδοσης. Κατά το σχεδιασμό ευρετηρίων, πρέπει να ληφθούν υπόψη πολλές σκέψεις σχετικά με τη βάση δεδομένων και τα ερωτήματα σε σχέση με αυτήν.
Βάση δεδομένων
Όπως αναφέρθηκε προηγουμένως, τα ευρετήρια μπορούν να βελτιώσουν την απόδοση του συστήματος επειδή παρέχουν στη μηχανή αναζήτησης έναν γρήγορο τρόπο εύρεσης δεδομένων. Ωστόσο, θα πρέπει επίσης να λάβετε υπόψη πόσο συχνά σκοπεύετε να εισάγετε, να ενημερώνετε ή να διαγράφετε δεδομένα. Όταν αλλάζετε δεδομένα, τα ευρετήρια πρέπει επίσης να αλλάζουν ώστε να αντικατοπτρίζουν τις αντίστοιχες ενέργειες στα δεδομένα, γεγονός που μπορεί να μειώσει σημαντικά την απόδοση του συστήματος. Λάβετε υπόψη τις ακόλουθες οδηγίες όταν σχεδιάζετε τη στρατηγική ευρετηρίασής σας:
  • Για πίνακες που ενημερώνονται συχνά, χρησιμοποιήστε όσο το δυνατόν λιγότερα ευρετήρια.
  • Εάν ο πίνακας περιέχει μεγάλο όγκο δεδομένων αλλά οι αλλαγές είναι μικρές, χρησιμοποιήστε όσα ευρετήρια χρειάζονται για να βελτιώσετε την απόδοση των ερωτημάτων σας. Ωστόσο, σκεφτείτε προσεκτικά πριν χρησιμοποιήσετε ευρετήρια σε μικρούς πίνακες, γιατί... Είναι πιθανό η χρήση μιας αναζήτησης ευρετηρίου να διαρκέσει περισσότερο από την απλή σάρωση όλων των σειρών.
  • Για ομαδοποιημένα ευρετήρια, προσπαθήστε να διατηρήσετε τα πεδία όσο το δυνατόν πιο σύντομα. Η καλύτερη προσέγγιση είναι να χρησιμοποιήσετε ένα ομαδοποιημένο ευρετήριο σε στήλες που έχουν μοναδικές τιμές και δεν επιτρέπουν NULL. Αυτός είναι ο λόγος για τον οποίο ένα πρωτεύον κλειδί χρησιμοποιείται συχνά ως ευρετήριο συμπλέγματος.
  • Η μοναδικότητα των τιμών σε μια στήλη επηρεάζει την απόδοση του ευρετηρίου. Γενικά, όσο περισσότερα διπλότυπα έχετε σε μια στήλη, τόσο χειρότερη είναι η απόδοση του ευρετηρίου. Από την άλλη πλευρά, όσο περισσότερες μοναδικές τιμές υπάρχουν, τόσο καλύτερη είναι η απόδοση του δείκτη. Χρησιμοποιήστε ένα μοναδικό ευρετήριο όποτε είναι δυνατόν.
  • Για ένα σύνθετο ευρετήριο, λάβετε υπόψη τη σειρά των στηλών στο ευρετήριο. Στήλες που χρησιμοποιούνται σε εκφράσεις ΟΠΟΥ(Για παράδειγμα, WHERE FirstName = "Charlie") πρέπει να είναι πρώτο στο ευρετήριο. Οι επόμενες στήλες πρέπει να παρατίθενται με βάση τη μοναδικότητα των τιμών τους (οι στήλες με τον μεγαλύτερο αριθμό μοναδικών τιμών έρχονται πρώτες).
  • Μπορείτε επίσης να καθορίσετε ένα ευρετήριο σε υπολογιζόμενες στήλες εάν πληρούν ορισμένες απαιτήσεις. Για παράδειγμα, οι εκφράσεις που χρησιμοποιούνται για τη λήψη της τιμής μιας στήλης πρέπει να είναι ντετερμινιστικές (να επιστρέφετε πάντα το ίδιο αποτέλεσμα για ένα δεδομένο σύνολο παραμέτρων εισόδου).
Ερωτήματα βάσης δεδομένων
Μια άλλη σκέψη κατά το σχεδιασμό ευρετηρίων είναι ποια ερωτήματα εκτελούνται στη βάση δεδομένων. Όπως αναφέρθηκε προηγουμένως, πρέπει να εξετάσετε πόσο συχνά αλλάζουν τα δεδομένα. Επιπλέον, θα πρέπει να χρησιμοποιούνται οι ακόλουθες αρχές:
  • Προσπαθήστε να εισαγάγετε ή να τροποποιήσετε όσο το δυνατόν περισσότερες σειρές σε ένα ερώτημα, αντί να το κάνετε σε πολλά μεμονωμένα ερωτήματα.
  • Δημιουργήστε ένα μη συγκεντρωμένο ευρετήριο σε στήλες που χρησιμοποιούνται συχνά ως όροι αναζήτησης στα ερωτήματά σας. ΟΠΟΥκαι συνδέσεις σε ΣΥΜΜΕΤΟΧΗ.
  • Εξετάστε το ενδεχόμενο δημιουργίας ευρετηρίου στηλών που χρησιμοποιούνται σε ερωτήματα αναζήτησης σειρών για ακριβείς αντιστοιχίσεις τιμών.

Και τώρα, στην πραγματικότητα:

14 ερωτήσεις σχετικά με τα ευρετήρια στον SQL Server που ντρέπεστε να κάνετε

Γιατί ένας πίνακας δεν μπορεί να έχει δύο ομαδοποιημένα ευρετήρια;

Θέλετε μια σύντομη απάντηση; Ένα ομαδοποιημένο ευρετήριο είναι ένας πίνακας. Όταν δημιουργείτε ένα ομαδοποιημένο ευρετήριο σε έναν πίνακα, η μηχανή αποθήκευσης ταξινομεί όλες τις σειρές του πίνακα με αύξουσα ή φθίνουσα σειρά, σύμφωνα με τον ορισμό του ευρετηρίου. Ένα ομαδοποιημένο ευρετήριο δεν είναι μια ξεχωριστή οντότητα όπως άλλα ευρετήρια, αλλά ένας μηχανισμός για την ταξινόμηση δεδομένων σε έναν πίνακα και τη διευκόλυνση της γρήγορης πρόσβασης σε σειρές δεδομένων.
Ας φανταστούμε ότι έχετε έναν πίνακα που περιέχει το ιστορικό των συναλλαγών πωλήσεων. Ο πίνακας πωλήσεων περιλαμβάνει πληροφορίες όπως αναγνωριστικό παραγγελίας, θέση προϊόντος στην παραγγελία, αριθμό είδους, ποσότητα προϊόντος, αριθμό παραγγελίας και ημερομηνία κ.λπ. Δημιουργείτε ένα συμπλεγμένο ευρετήριο σε στήλες Αριθμός ΠαραγγελίαςΚαι Αναγνωριστικό γραμμής, ταξινομημένο με αύξουσα σειρά όπως φαίνεται παρακάτω T-SQLκώδικας:
ΔΗΜΙΟΥΡΓΙΑ ΜΟΝΑΔΙΚΟΥ ΣΥΓΚΕΝΤΡΩΜΕΝΟΥ ΕΥΡΕΤΗΡΙΟΥ ix_oriderid_lineid ΣΤΟ dbo.Sales(OrderID, LineID);
Όταν εκτελείτε αυτό το σενάριο, όλες οι σειρές στον πίνακα θα ταξινομηθούν φυσικά πρώτα κατά τη στήλη OrderID και μετά κατά LineID, αλλά τα ίδια τα δεδομένα θα παραμείνουν σε ένα μόνο λογικό μπλοκ, τον πίνακα. Για αυτόν τον λόγο, δεν μπορείτε να δημιουργήσετε δύο συμπλέγματα ευρετηρίων. Μπορεί να υπάρχει μόνο ένας πίνακας με ένα δεδομένα και αυτός ο πίνακας μπορεί να ταξινομηθεί μόνο μία φορά με συγκεκριμένη σειρά.

Εάν ένας ομαδοποιημένος πίνακας παρέχει πολλά οφέλη, τότε γιατί να χρησιμοποιήσετε έναν σωρό;

Εχεις δίκιο. Οι συμπλεγμένοι πίνακες είναι υπέροχοι και τα περισσότερα από τα ερωτήματά σας θα έχουν καλύτερη απόδοση σε πίνακες που έχουν ευρετήριο συμπλέγματος. Αλλά σε ορισμένες περιπτώσεις μπορεί να θέλετε να αφήσετε τα τραπέζια στη φυσική, παρθένα κατάστασή τους, δηλ. με τη μορφή ενός σωρού και δημιουργήστε μόνο μη συμπλεγματοποιημένα ευρετήρια για να συνεχίσετε να εκτελούνται τα ερωτήματά σας.
Ο σωρός, όπως θυμάστε, αποθηκεύει δεδομένα με τυχαία σειρά. Συνήθως, το υποσύστημα αποθήκευσης προσθέτει δεδομένα σε έναν πίνακα με τη σειρά με την οποία εισάγονται, αλλά στο υποσύστημα αποθήκευσης αρέσει επίσης να μετακινεί σειρές για πιο αποτελεσματική αποθήκευση. Ως αποτέλεσμα, δεν έχετε την ευκαιρία να προβλέψετε με ποια σειρά θα αποθηκευτούν τα δεδομένα.
Εάν η μηχανή ερωτημάτων χρειάζεται να βρει δεδομένα χωρίς το πλεονέκτημα ενός μη συμπλεγματοποιημένου ευρετηρίου, θα κάνει μια πλήρη σάρωση του πίνακα για να βρει τις σειρές που χρειάζεται. Σε πολύ μικρά τραπέζια αυτό συνήθως δεν αποτελεί πρόβλημα, αλλά καθώς ο σωρός μεγαλώνει σε μέγεθος, η απόδοση πέφτει γρήγορα. Φυσικά, ένα ευρετήριο χωρίς ομαδοποίηση μπορεί να βοηθήσει χρησιμοποιώντας έναν δείκτη στο αρχείο, τη σελίδα και τη γραμμή όπου αποθηκεύονται τα απαραίτητα δεδομένα - συνήθως αυτό είναι πολύ περισσότερο καλύτερη εναλλακτικήσάρωση του πίνακα. Ακόμα κι έτσι, είναι δύσκολο να συγκρίνουμε τα πλεονεκτήματα ενός ευρετηρίου συμπλέγματος όταν εξετάζουμε την απόδοση ερωτήματος.
Ωστόσο, το σωρό μπορεί να βοηθήσει στη βελτίωση της απόδοσης σε ορισμένες περιπτώσεις. Σκεφτείτε ένα τραπέζι με μεγάλο ποσόεισαγωγές, αλλά με σπάνιες ενημερώσεις ή διαγραφές δεδομένων. Για παράδειγμα, ένας πίνακας που αποθηκεύει ένα αρχείο καταγραφής χρησιμοποιείται κυρίως για την εισαγωγή τιμών μέχρι να αρχειοθετηθεί. Στο σωρό, δεν θα βλέπετε τη σελιδοποίηση και τον κατακερματισμό δεδομένων όπως θα κάνατε με ένα ομαδοποιημένο ευρετήριο, επειδή οι σειρές απλώς προστίθενται στο τέλος του σωρού. Ο υπερβολικός διαχωρισμός σελίδων μπορεί να έχει σημαντικό αντίκτυπο στην απόδοση, και όχι με καλό τρόπο. Γενικά, ο σωρός σάς επιτρέπει να εισάγετε δεδομένα σχετικά ανώδυνα και δεν θα χρειαστεί να αντιμετωπίσετε τα γενικά έξοδα αποθήκευσης και συντήρησης που θα κάνατε με ένα ομαδοποιημένο ευρετήριο.
Αλλά η έλλειψη ενημέρωσης και διαγραφής δεδομένων δεν πρέπει να θεωρείται ο μόνος λόγος. Ο τρόπος δειγματοληψίας των δεδομένων είναι επίσης σημαντικός παράγοντας. Για παράδειγμα, δεν θα πρέπει να χρησιμοποιείτε σωρό εάν υποβάλλετε συχνά ερωτήματα σε εύρη δεδομένων ή εάν τα δεδομένα που ζητάτε συχνά πρέπει να ταξινομηθούν ή να ομαδοποιηθούν.
Όλα αυτά σημαίνουν ότι θα πρέπει να σκεφτείτε να χρησιμοποιήσετε το σωρό μόνο όταν εργάζεστε με πολύ μικρούς πίνακες ή όταν όλη η αλληλεπίδρασή σας με τον πίνακα περιορίζεται στην εισαγωγή δεδομένων και τα ερωτήματά σας είναι εξαιρετικά απλά (και χρησιμοποιείτε ευρετήρια χωρίς συμπλέγματα ΤΕΛΟΣ παντων). Διαφορετικά, χρησιμοποιήστε ένα καλά σχεδιασμένο ευρετήριο συμπλέγματος, όπως αυτό που ορίζεται σε ένα απλό αύξον πεδίο κλειδιού, όπως μια ευρέως χρησιμοποιούμενη στήλη με ΤΑΥΤΟΤΗΤΑ.

Πώς μπορώ να αλλάξω τον προεπιλεγμένο παράγοντα πλήρωσης ευρετηρίου;

Η αλλαγή του προεπιλεγμένου συντελεστή πλήρωσης ευρετηρίου είναι ένα πράγμα. Η κατανόηση του τρόπου λειτουργίας της προεπιλεγμένης αναλογίας είναι ένα άλλο θέμα. Αλλά πρώτα, κάντε μερικά βήματα πίσω. Ο παράγοντας πλήρωσης ευρετηρίου καθορίζει την ποσότητα του χώρου στη σελίδα για την αποθήκευση του ευρετηρίου στο κάτω επίπεδο (επίπεδο φύλλου) πριν αρχίσει να γεμίζει ΝΕΑ ΣΕΛΙΔΑ. Για παράδειγμα, εάν ο συντελεστής οριστεί στο 90, τότε όταν το ευρετήριο μεγαλώσει, θα καταλάβει το 90% της σελίδας και στη συνέχεια θα μετακινηθεί στην επόμενη σελίδα.
Από προεπιλογή, η τιμή του παράγοντα πλήρωσης ευρετηρίου είναι in SQL Serverείναι το 0, το οποίο είναι το ίδιο με το 100. Ως αποτέλεσμα, όλα τα νέα ευρετήρια κληρονομούν αυτόματα αυτήν τη ρύθμιση, εκτός εάν καθορίσετε συγκεκριμένα μια τιμή στον κώδικά σας που είναι διαφορετική από την τυπική τιμή του συστήματος ή αλλάξετε την προεπιλεγμένη συμπεριφορά. Μπορείς να χρησιμοποιήσεις SQL Server Management Studioγια να προσαρμόσετε την προεπιλεγμένη τιμή ή να εκτελέσετε μια αποθηκευμένη διαδικασία συστήματος sp_configure. Για παράδειγμα, το ακόλουθο σύνολο T-SQLεντολές ορίζει την τιμή του συντελεστή στο 90 (πρέπει πρώτα να μεταβείτε στη λειτουργία σύνθετων ρυθμίσεων):
EXEC sp_configure "εμφάνιση σύνθετων επιλογών", 1; GO RECONFIGURE? GO EXEC sp_configure "fill factor", 90; GO RECONFIGURE? ΠΗΓΑΙΝΩ
Αφού αλλάξετε την τιμή του παράγοντα πλήρωσης ευρετηρίου, πρέπει να επανεκκινήσετε την υπηρεσία SQL Server. Μπορείτε τώρα να ελέγξετε την τιμή που έχει οριστεί εκτελώντας το sp_configure χωρίς το καθορισμένο δεύτερο όρισμα:
EXEC sp_configure "fill factor" GO
Αυτή η εντολή θα πρέπει να επιστρέψει μια τιμή 90. Ως αποτέλεσμα, όλα τα ευρετήρια που δημιουργήθηκαν πρόσφατα θα χρησιμοποιούν αυτήν την τιμή. Μπορείτε να το δοκιμάσετε δημιουργώντας ένα ευρετήριο και υποβάλλοντας ερώτημα για την τιμή του συντελεστή πλήρωσης:
ΧΡΗΣΗ AdventureWorks2012; -- Η βάση δεδομένων σας GO CREATE NONCLUSTERED INDEX ix_people_lastname ON Person.Person(LastName); GO SELECT fill_factor FROM sys.indexes WHERE object_id = object_id("Person.Person") AND name="ix_people_lastname";
ΣΕ σε αυτό το παράδειγμαδημιουργήσαμε ένα μη ομαδοποιημένο ευρετήριο στον πίνακα Πρόσωποστη βάση δεδομένων AdventureWorks2012. Μετά τη δημιουργία του ευρετηρίου, μπορούμε να πάρουμε την τιμή του παράγοντα πλήρωσης από τους πίνακες συστήματος sys.indexes. Το ερώτημα πρέπει να επιστρέψει 90.
Ωστόσο, ας φανταστούμε ότι διαγράψαμε το ευρετήριο και το δημιουργήσαμε ξανά, αλλά τώρα καθορίσαμε μια συγκεκριμένη τιμή συντελεστή πλήρωσης:
CREATE NONCLUSTERED INDEX ix_people_lastname ON Person.Person(LastName) WITH (fillfactor=80); GO SELECT fill_factor FROM sys.indexes WHERE object_id = object_id("Person.Person") AND name="ix_people_lastname";
Αυτή τη φορά προσθέσαμε οδηγίες ΜΕκαι επιλογή παράγοντας πλήρωσηςγια τη λειτουργία δημιουργίας ευρετηρίου μας ΔΗΜΙΟΥΡΓΙΑ ΕΥΡΕΤΗΡΙΟΥκαι καθόρισε την τιμή 80. Χειριστής ΕΠΙΛΕΓΩτώρα επιστρέφει την αντίστοιχη τιμή.
Μέχρι στιγμής, όλα ήταν αρκετά ξεκάθαρα. Εκεί που μπορείτε πραγματικά να καείτε σε όλη αυτή τη διαδικασία είναι όταν δημιουργείτε ένα ευρετήριο που χρησιμοποιεί μια προεπιλεγμένη τιμή συντελεστή, υποθέτοντας ότι γνωρίζετε αυτήν την τιμή. Για παράδειγμα, κάποιος ασχολείται με τις ρυθμίσεις του διακομιστή και είναι τόσο πεισματάρης που ορίζει τον παράγοντα πλήρωσης ευρετηρίου στο 20. Εν τω μεταξύ, συνεχίζετε να δημιουργείτε ευρετήρια, υποθέτοντας ότι η προεπιλεγμένη τιμή είναι 0. Δυστυχώς, δεν έχετε τρόπο να μάθετε το γέμισμα συντελεστή έως ότου δεν δημιουργήσετε ένα ευρετήριο και στη συνέχεια ελέγξτε την τιμή όπως κάναμε στα παραδείγματά μας. Διαφορετικά, θα πρέπει να περιμένετε τη στιγμή που η απόδοση του ερωτήματος πέσει τόσο πολύ που θα αρχίσετε να υποψιάζεστε κάτι.
Ένα άλλο ζήτημα που πρέπει να γνωρίζετε είναι η ανακατασκευή ευρετηρίων. Όπως και με τη δημιουργία ενός ευρετηρίου, μπορείτε να καθορίσετε την τιμή του παράγοντα πλήρωσης ευρετηρίου κατά την ανακατασκευή του. Ωστόσο, σε αντίθεση με την εντολή δημιουργίας ευρετηρίου, η ανακατασκευή δεν χρησιμοποιεί τις προεπιλεγμένες ρυθμίσεις του διακομιστή, παρά το ότι μπορεί να φαίνεται. Ακόμη περισσότερο, αν δεν προσδιορίσετε συγκεκριμένα την τιμή του παράγοντα πλήρωσης δείκτη, τότε SQL Serverθα χρησιμοποιήσει την τιμή του συντελεστή με τον οποίο υπήρχε αυτός ο δείκτης πριν από την αναδιάρθρωσή του. Για παράδειγμα, η ακόλουθη λειτουργία ΑΛΛΑΓΗ ΔΕΙΚΤΗανακατασκευάζει το ευρετήριο που μόλις δημιουργήσαμε:
ALTER INDEX ix_people_lastname ON Person.Person REBUILD; GO SELECT fill_factor FROM sys.indexes WHERE object_id = object_id("Person.Person") AND name="ix_people_lastname";
Όταν ελέγχουμε την τιμή του συντελεστή πλήρωσης, θα λάβουμε μια τιμή 80, επειδή αυτή καθορίσαμε την τελευταία φορά που δημιουργήσαμε το ευρετήριο. Η προεπιλεγμένη τιμή αγνοείται.
Όπως μπορείτε να δείτε, η αλλαγή της τιμής του συντελεστή πλήρωσης δείκτη δεν είναι τόσο δύσκολη. Είναι πολύ πιο δύσκολο να γνωρίζουμε την τρέχουσα τιμή και να κατανοήσουμε πότε εφαρμόζεται. Εάν προσδιορίζετε πάντα συγκεκριμένα τον συντελεστή κατά τη δημιουργία και την ανακατασκευή ευρετηρίων, τότε γνωρίζετε πάντα το συγκεκριμένο αποτέλεσμα. Εκτός και αν πρέπει να ανησυχείτε για να βεβαιωθείτε ότι κάποιος άλλος δεν θα χαλάσει ξανά τις ρυθμίσεις του διακομιστή, προκαλώντας την εκ νέου κατασκευή όλων των ευρετηρίων με έναν γελοία χαμηλό συντελεστή πλήρωσης δείκτη.

Είναι δυνατόν να δημιουργηθεί ένα ευρετήριο συμπλέγματος σε μια στήλη που περιέχει διπλότυπα;

Ναι και ΟΧΙ. Ναι, μπορείτε να δημιουργήσετε ένα συμπλεγμένο ευρετήριο σε μια στήλη κλειδιού που περιέχει διπλότυπες τιμές. Όχι, η τιμή μιας στήλης κλειδιού δεν μπορεί να παραμείνει σε μη μοναδική κατάσταση. ΑΣΕ με να εξηγήσω. Εάν δημιουργήσετε ένα μη μοναδικό ευρετήριο συμπλέγματος σε μια στήλη, ο μηχανισμός αποθήκευσης προσθέτει ένα uniquifier στη διπλότυπη τιμή για να διασφαλίσει τη μοναδικότητα και επομένως να μπορεί να προσδιορίσει κάθε γραμμή στον πίνακα συμπλέγματος.
Για παράδειγμα, μπορεί να αποφασίσετε να δημιουργήσετε ένα ομαδοποιημένο ευρετήριο σε μια στήλη που περιέχει δεδομένα πελατών Επίθετοκρατώντας το επώνυμο. Η στήλη περιέχει τις τιμές Franklin, Hancock, Washington και Smith. Στη συνέχεια, εισάγετε ξανά τις τιμές Adams, Hancock, Smith και Smith. Αλλά η τιμή της στήλης κλειδιού πρέπει να είναι μοναδική, επομένως ο μηχανισμός αποθήκευσης θα αλλάξει την τιμή των διπλότυπων έτσι ώστε να φαίνονται κάπως έτσι: Adams, Franklin, Hancock, Hancock1234, Washington, Smith, Smith4567 και Smith5678.
Με την πρώτη ματιά, αυτή η προσέγγιση φαίνεται καλή, αλλά μια ακέραια τιμή αυξάνει το μέγεθος του κλειδιού, το οποίο μπορεί να γίνει πρόβλημα εάν υπάρχει μεγάλος αριθμός διπλότυπων και αυτές οι τιμές θα γίνουν η βάση ενός μη συμπλεγματοποιημένου ευρετηρίου ή ενός ξένου βασική αναφορά. Για αυτούς τους λόγους, θα πρέπει πάντα να προσπαθείτε να δημιουργείτε μοναδικά ευρετήρια συμπλέγματος όποτε είναι δυνατόν. Αν αυτό δεν είναι δυνατό, τότε τουλάχιστονπροσπαθήστε να χρησιμοποιήσετε στήλες με πολύ υψηλό περιεχόμενο μοναδικών τιμών.

Πώς αποθηκεύεται ο πίνακας εάν δεν έχει δημιουργηθεί ένα ευρετήριο συμπλέγματος;

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

Ποια είναι η σχέση μεταξύ των περιορισμών μοναδικότητας τιμών και ενός πρωτεύοντος κλειδιού με ευρετήρια πινάκων;

Ένα πρωτεύον κλειδί και ένας μοναδικός περιορισμός διασφαλίζουν ότι οι τιμές σε μια στήλη είναι μοναδικές. Μπορείτε να δημιουργήσετε μόνο ένα πρωτεύον κλειδί για έναν πίνακα και δεν μπορεί να περιέχει τιμές ΜΗΔΕΝΙΚΟ. Μπορείτε να δημιουργήσετε αρκετούς περιορισμούς στη μοναδικότητα μιας τιμής για έναν πίνακα και καθένας από αυτούς μπορεί να έχει μία μόνο εγγραφή ΜΗΔΕΝΙΚΟ.
Όταν δημιουργείτε ένα πρωτεύον κλειδί, η μηχανή αποθήκευσης δημιουργεί επίσης ένα μοναδικό ευρετήριο συμπλέγματος εάν δεν έχει ήδη δημιουργηθεί ένα ευρετήριο συμπλέγματος. Ωστόσο, μπορείτε να παρακάμψετε την προεπιλεγμένη συμπεριφορά και θα δημιουργηθεί ένα ευρετήριο χωρίς συμπλέγματα. Εάν υπάρχει ένα ευρετήριο συμπλέγματος όταν δημιουργείτε το πρωτεύον κλειδί, θα δημιουργηθεί ένα μοναδικό ευρετήριο χωρίς συμπλέγματα.
Όταν δημιουργείτε έναν μοναδικό περιορισμό, η μηχανή αποθήκευσης δημιουργεί ένα μοναδικό, μη συμπλεγματοποιημένο ευρετήριο. Ωστόσο, μπορείτε να καθορίσετε τη δημιουργία ενός μοναδικού ευρετηρίου συμπλέγματος εάν δεν έχει δημιουργηθεί προηγουμένως.
Γενικά, ένας περιορισμός μοναδικής τιμής και ένας μοναδικός δείκτης είναι το ίδιο πράγμα.

Γιατί τα ευρετήρια συμπλέγματος και μη ονομάζονται B-tree στον SQL Server;

Τα βασικά ευρετήρια στον SQL Server, συμπλεγμένα ή μη, κατανέμονται σε σύνολα σελίδων που ονομάζονται κόμβοι ευρετηρίου. Αυτές οι σελίδες είναι οργανωμένες σε μια συγκεκριμένη ιεραρχία με μια δομή δέντρου που ονομάζεται ισορροπημένο δέντρο. Στο επάνω επίπεδο υπάρχει ο κόμβος ρίζας, στο κάτω μέρος υπάρχουν οι κόμβοι των φύλλων, με ενδιάμεσους κόμβους μεταξύ του πάνω και του κάτω επιπέδου, όπως φαίνεται στο σχήμα:


Ο ριζικός κόμβος παρέχει το κύριο σημείο εισόδου για ερωτήματα που επιχειρούν να ανακτήσουν δεδομένα μέσω του ευρετηρίου. Ξεκινώντας από αυτόν τον κόμβο, το υποσύστημα ερωτήματος ξεκινά μια μετάβαση κατά μήκος ιεραρχική δομήστον κατάλληλο κόμβο φύλλου που περιέχει τα δεδομένα.
Για παράδειγμα, φανταστείτε ότι έχει ληφθεί ένα αίτημα για επιλογή σειρών που περιέχουν μια τιμή κλειδιού 82. Το υποσύστημα ερωτήματος ξεκινά να λειτουργεί από τον ριζικό κόμβο, ο οποίος αναφέρεται σε έναν κατάλληλο ενδιάμεσο κόμβο, στην περίπτωσή μας 1-100. Από τον ενδιάμεσο κόμβο 1-100 γίνεται μετάβαση στον κόμβο 51-100 και από εκεί στον τελικό κόμβο 76-100. Εάν πρόκειται για ευρετήριο συμπλέγματος, τότε το φύλλο κόμβου περιέχει τα δεδομένα της σειράς που σχετίζεται με το κλειδί ίσο με 82. Εάν πρόκειται για μη ομαδοποιημένο ευρετήριο, τότε το φύλλο ευρετηρίου περιέχει έναν δείκτη προς τον πίνακα συμπλέγματος ή μια συγκεκριμένη γραμμή στο ο σωρός.

Πώς μπορεί ένα ευρετήριο να βελτιώσει ακόμη και την απόδοση του ερωτήματος εάν πρέπει να διασχίσετε όλους αυτούς τους κόμβους ευρετηρίου;

Πρώτον, τα ευρετήρια δεν βελτιώνουν πάντα την απόδοση. Πάρα πολλά ευρετήρια που έχουν δημιουργηθεί εσφαλμένα μετατρέπουν το σύστημα σε τέλμα και υποβαθμίζουν την απόδοση των ερωτημάτων. Είναι πιο ακριβές να πούμε ότι εάν τα ευρετήρια εφαρμοστούν προσεκτικά, μπορούν να προσφέρουν σημαντικά κέρδη απόδοσης.
Σκεφτείτε ένα τεράστιο βιβλίο αφιερωμένο στον συντονισμό απόδοσης SQL Server(έντυπη έκδοση, όχι ηλεκτρονική έκδοση). Φανταστείτε ότι θέλετε να βρείτε πληροφορίες σχετικά με τη διαμόρφωση του Resource Governor. Μπορείτε να σύρετε το δάχτυλό σας σελίδα προς σελίδα σε ολόκληρο το βιβλίο ή να ανοίξετε τον πίνακα περιεχομένων και να μάθετε τον ακριβή αριθμό σελίδας με τις πληροφορίες που αναζητάτε (υπό την προϋπόθεση ότι το βιβλίο έχει ευρετηριαστεί σωστά και τα περιεχόμενα έχουν τα σωστά ευρετήρια). Αυτό σίγουρα θα σας εξοικονομήσει σημαντικό χρόνο, παρόλο που πρέπει πρώτα να αποκτήσετε πρόσβαση σε μια εντελώς διαφορετική δομή (το ευρετήριο) για να λάβετε τις πληροφορίες που χρειάζεστε από την κύρια δομή (το βιβλίο).
Όπως ένα ευρετήριο βιβλίου, ένα ευρετήριο σε SQL Serverσας επιτρέπει να εκτελείτε ακριβή ερωτήματα στα δεδομένα που χρειάζεστε αντί να σαρώνετε πλήρως όλα τα δεδομένα που περιέχονται σε έναν πίνακα. Για μικρούς πίνακες, η πλήρης σάρωση συνήθως δεν αποτελεί πρόβλημα, αλλά οι μεγάλοι πίνακες καταλαμβάνουν πολλές σελίδες δεδομένων, γεγονός που μπορεί να έχει ως αποτέλεσμα σημαντικό χρόνο εκτέλεσης ερωτήματος, εκτός εάν υπάρχει ευρετήριο που επιτρέπει στη μηχανή αναζήτησης να αποκτήσει αμέσως τη σωστή θέση των δεδομένων. Φανταστείτε να χαθείτε σε μια οδική διασταύρωση πολλαπλών επιπέδων μπροστά από μια μεγάλη μητρόπολη χωρίς χάρτη και θα έχετε την ιδέα.

Εάν τα ευρετήρια είναι τόσο σπουδαία, γιατί να μην δημιουργήσετε απλώς ένα σε κάθε στήλη;

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

Είναι απαραίτητο να δημιουργηθεί ένα συμπλεγμένο ευρετήριο σε μια στήλη με πρωτεύον κλειδί;

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

Τι γίνεται αν ευρετηριάζετε μια προβολή, εξακολουθεί να είναι μια προβολή;

Η παρουσίαση είναι εικονικό τραπέζι, το οποίο δημιουργεί δεδομένα από έναν ή περισσότερους πίνακες. Ουσιαστικά, είναι ένα επώνυμο ερώτημα που ανακτά δεδομένα από τους υποκείμενους πίνακες όταν υποβάλλετε ερώτημα σε αυτήν την προβολή. Μπορείτε να βελτιώσετε την απόδοση του ερωτήματος δημιουργώντας ένα ευρετήριο συμπλέγματος και μη συμπλεγματοποιημένα ευρετήρια σε αυτήν την προβολή, παρόμοια με τον τρόπο που δημιουργείτε ευρετήρια σε έναν πίνακα, αλλά η κύρια προειδοποίηση είναι ότι πρώτα δημιουργείτε ένα ευρετήριο συμπλέγματος και, στη συνέχεια, μπορείτε να δημιουργήσετε ένα μη συμπλεγματοποιημένο.
Όταν δημιουργείται μια ευρετηριασμένη προβολή (υλοποιημένη προβολή), τότε ο ίδιος ο ορισμός της προβολής παραμένει ξεχωριστή οντότητα. Σε τελική ανάλυση, αυτός είναι απλώς ένας χειριστής με σκληρό κώδικα ΕΠΙΛΕΓΩ, αποθηκευμένο στη βάση δεδομένων. Αλλά ο δείκτης είναι μια εντελώς διαφορετική ιστορία. Όταν δημιουργείτε ένα ευρετήριο συμπλέγματος ή μη σε έναν πάροχο, τα δεδομένα αποθηκεύονται φυσικά στο δίσκο, ακριβώς όπως ένα κανονικό ευρετήριο. Επιπλέον, όταν αλλάζουν δεδομένα σε υποκείμενους πίνακες, το ευρετήριο της προβολής αλλάζει αυτόματα (αυτό σημαίνει ότι ίσως θέλετε να αποφύγετε την ευρετηρίαση προβολών σε πίνακες που αλλάζουν συχνά). Σε κάθε περίπτωση, η προβολή παραμένει προβολή - μια ματιά στους πίνακες, αλλά με ακρίβεια εκτελεσμένη μέσα αυτή τη στιγμή, με ευρετήρια που αντιστοιχούν σε αυτό.
Για να μπορέσετε να δημιουργήσετε ένα ευρετήριο σε μια προβολή, πρέπει να πληροί αρκετούς περιορισμούς. Για παράδειγμα, μια προβολή μπορεί να αναφέρεται μόνο σε βασικούς πίνακες, αλλά όχι σε άλλες προβολές και αυτοί οι πίνακες πρέπει να βρίσκονται στην ίδια βάση δεδομένων. Υπάρχουν στην πραγματικότητα πολλοί άλλοι περιορισμοί, οπότε φροντίστε να ελέγξετε την τεκμηρίωση SQL Serverγια όλες τις βρώμικες λεπτομέρειες.

Γιατί να χρησιμοποιήσετε ένα ευρετήριο κάλυψης αντί για ένα σύνθετο ευρετήριο;

Αρχικά, ας βεβαιωθούμε ότι κατανοούμε τη διαφορά μεταξύ των δύο. Ένας σύνθετος δείκτης είναι απλώς ένας κανονικός δείκτης που περιέχει περισσότερες από μία στήλες. Μπορούν να χρησιμοποιηθούν πολλές στήλες κλειδιών για να διασφαλιστεί ότι κάθε μία είναι μοναδική σειρές τραπεζιών, είναι επίσης πιθανό το πρωτεύον κλειδί να αποτελείται από πολλές στήλες για να διασφαλιστεί η μοναδικότητά του ή να προσπαθείτε να βελτιστοποιήσετε την εκτέλεση ερωτημάτων που επικαλούνται συχνά σε πολλές στήλες. Γενικά, ωστόσο, όσο περισσότερες στήλες κλειδιά περιέχει ένα ευρετήριο, τόσο λιγότερο αποδοτικός θα είναι ο δείκτης, πράγμα που σημαίνει ότι τα σύνθετα ευρετήρια πρέπει να χρησιμοποιούνται με σύνεση.
Όπως αναφέρθηκε, ένα ερώτημα μπορεί να ωφεληθεί πολύ εάν όλα τα απαιτούμενα δεδομένα βρίσκονται αμέσως στα φύλλα του ευρετηρίου, όπως ακριβώς το ίδιο το ευρετήριο. Αυτό δεν αποτελεί πρόβλημα για έναν ομαδοποιημένο ευρετήριο γιατί όλα τα δεδομένα είναι ήδη εκεί (γι' αυτό είναι τόσο σημαντικό να σκέφτεστε προσεκτικά όταν δημιουργείτε ένα ομαδοποιημένο ευρετήριο). Αλλά ένα μη ομαδοποιημένο ευρετήριο σε φύλλα περιέχει μόνο στήλες κλειδιών. Για να αποκτήσετε πρόσβαση σε όλα τα άλλα δεδομένα, το εργαλείο βελτιστοποίησης ερωτημάτων απαιτεί πρόσθετα βήματα, τα οποία μπορούν να προσθέσουν σημαντικά έξοδα για την εκτέλεση των ερωτημάτων σας.
Εδώ έρχεται να σώσει ο δείκτης κάλυψης. Όταν ορίζετε ένα ευρετήριο χωρίς συμπλέγματα, μπορείτε να καθορίσετε πρόσθετες στήλες στις βασικές σας στήλες. Για παράδειγμα, ας υποθέσουμε ότι η εφαρμογή σας υποβάλλει συχνά ερωτήματα για δεδομένα στηλών Αριθμός ΠαραγγελίαςΚαι Ημερομηνία παραγγελίαςστο τραπέζι Εκπτώσεις:
SELECT OrderID, OrderDate FROM Sales WHERE OrderID = 12345;
Μπορείτε να δημιουργήσετε ένα σύνθετο μη συμπλεγματοποιημένο ευρετήριο και στις δύο στήλες, αλλά η στήλη OrderDate θα προσθέσει μόνο γενικά έξοδα συντήρησης ευρετηρίου χωρίς να χρησιμεύει ως ιδιαίτερα χρήσιμη στήλη κλειδιού. Η καλύτερη απόφασηθα ήταν η δημιουργία ενός ευρετηρίου κάλυψης στη στήλη κλειδιού Αριθμός Παραγγελίαςκαι επιπλέον περιλαμβάνεται στήλη Ημερομηνία παραγγελίας:
CREATE NONCLUSTERED INDEX ix_orderid ON dbo.Sales(OrderID) INCLUDE (OrderDate);
Αυτό αποφεύγει τα μειονεκτήματα της ευρετηρίασης περιττών στηλών, διατηρώντας παράλληλα τα πλεονεκτήματα της αποθήκευσης δεδομένων σε φύλλα κατά την εκτέλεση ερωτημάτων. Η στήλη που περιλαμβάνεται δεν αποτελεί μέρος του κλειδιού, αλλά τα δεδομένα αποθηκεύονται στον κόμβο φύλλου, στο φύλλο ευρετηρίου. Αυτό μπορεί να βελτιώσει την απόδοση του ερωτήματος χωρίς επιπλέον επιβάρυνση. Επιπλέον, οι στήλες που περιλαμβάνονται στο ευρετήριο κάλυψης υπόκεινται σε λιγότερους περιορισμούς από τις βασικές στήλες του ευρετηρίου.

Έχει σημασία ο αριθμός των διπλότυπων σε μια στήλη κλειδιού;

Όταν δημιουργείτε ένα ευρετήριο, πρέπει να προσπαθήσετε να μειώσετε τον αριθμό των διπλότυπων στις στήλες των κλειδιών σας. Ή πιο συγκεκριμένα: προσπαθήστε να διατηρήσετε το ποσοστό επανάληψης όσο το δυνατόν χαμηλότερο.
Εάν εργάζεστε με ένα σύνθετο ευρετήριο, τότε ο διπλασιασμός ισχύει για όλες τις βασικές στήλες ως σύνολο. Μια μεμονωμένη στήλη μπορεί να περιέχει πολλές διπλές τιμές, αλλά θα πρέπει να υπάρχει ελάχιστη επανάληψη μεταξύ όλων των στηλών ευρετηρίου. Για παράδειγμα, δημιουργείτε ένα σύνθετο μη συμπλεγματοποιημένο ευρετήριο σε στήλες ΟνομαΚαι Επίθετο, μπορείτε να έχετε πολλές τιμές John Doe και πολλές τιμές Doe, αλλά θέλετε να έχετε όσο το δυνατόν λιγότερες τιμές John Doe ή κατά προτίμηση μόνο μία τιμή John Doe.
Ο λόγος μοναδικότητας των τιμών μιας βασικής στήλης ονομάζεται επιλεκτικότητα δείκτη. Όσο περισσότερες μοναδικές τιμές υπάρχουν, τόσο μεγαλύτερη είναι η επιλεκτικότητα: ένας μοναδικός δείκτης έχει τη μεγαλύτερη δυνατή επιλεκτικότητα. Στη μηχανή ερωτημάτων αρέσουν πολύ οι στήλες με τιμές υψηλής επιλεκτικότητας, ειδικά αν αυτές οι στήλες περιλαμβάνονται στις ρήτρες WHERE των ερωτημάτων που εκτελούνται πιο συχνά. Όσο πιο επιλεκτικός είναι ο δείκτης, τόσο πιο γρήγορα η μηχανή αναζήτησης μπορεί να μειώσει το μέγεθος του συνόλου δεδομένων που προκύπτει. Το μειονέκτημα, φυσικά, είναι ότι οι στήλες με σχετικά λίγες μοναδικές τιμές σπάνια θα είναι καλοί υποψήφιοι για ευρετηρίαση.

Είναι δυνατόν να δημιουργηθεί ένα μη ομαδοποιημένο ευρετήριο μόνο σε ένα συγκεκριμένο υποσύνολο δεδομένων μιας βασικής στήλης;

Από προεπιλογή, ένας μη συμπλεγματοποιημένος ευρετήριο περιέχει μία γραμμή για κάθε σειρά στον πίνακα. Φυσικά, μπορείτε να πείτε το ίδιο πράγμα για ένα ομαδοποιημένο ευρετήριο, υποθέτοντας ότι ένας τέτοιος δείκτης είναι ένας πίνακας. Αλλά όταν πρόκειται για ένα μη ομαδοποιημένο ευρετήριο, η σχέση ένας προς έναν είναι μια σημαντική έννοια γιατί, ξεκινώντας από την έκδοση SQL Server 2008, έχετε την επιλογή να δημιουργήσετε ένα ευρετήριο με δυνατότητα φιλτραρίσματος που περιορίζει τις σειρές που περιλαμβάνονται σε αυτό. Ένα φιλτραρισμένο ευρετήριο μπορεί να βελτιώσει την απόδοση του ερωτήματος επειδή... είναι μικρότερο σε μέγεθος και περιέχει φιλτραρισμένα, πιο ακριβή στατιστικά από όλα τα πίνακες - αυτό οδηγεί στη δημιουργία βελτιωμένων σχεδίων εκτέλεσης. Ένα φιλτραρισμένο ευρετήριο απαιτεί επίσης λιγότερο χώρο αποθήκευσης και χαμηλότερο κόστος συντήρησης. Το ευρετήριο ενημερώνεται μόνο όταν αλλάξουν τα δεδομένα που αντιστοιχούν στο φίλτρο.
Επιπλέον, είναι εύκολο να δημιουργηθεί ένα ευρετήριο με δυνατότητα φιλτραρίσματος. Στον χειριστή ΔΗΜΙΟΥΡΓΙΑ ΕΥΡΕΤΗΡΙΟΥαπλά πρέπει να υποδείξετε ΟΠΟΥκατάσταση φίλτρου. Για παράδειγμα, μπορείτε να φιλτράρετε όλες τις σειρές που περιέχουν NULL από το ευρετήριο, όπως φαίνεται στον κώδικα:
CREATE NONCLUSTERED INDEX ix_trackingnumber ON Sales.SalesOrderDetail(CarrierTrackingNumber) ΟΠΟΥ ο CarrierTrackingNumber ΔΕΝ ΕΙΝΑΙ NULL.
Μπορούμε, στην πραγματικότητα, να φιλτράρουμε τυχόν δεδομένα που δεν είναι σημαντικά σε κρίσιμα ερωτήματα. Προσοχή όμως γιατί... SQL Serverεπιβάλλει αρκετούς περιορισμούς σε ευρετήρια με δυνατότητα φιλτραρίσματος, όπως η αδυναμία δημιουργίας ευρετηρίου με δυνατότητα φιλτραρίσματος σε μια προβολή, επομένως διαβάστε προσεκτικά την τεκμηρίωση.
Μπορεί επίσης να μπορείτε να επιτύχετε παρόμοια αποτελέσματα δημιουργώντας μια προβολή ευρετηρίου. Ωστόσο, ένας φιλτραρισμένος δείκτης έχει πολλά πλεονεκτήματα, όπως τη δυνατότητα μείωσης του κόστους συντήρησης και βελτίωσης της ποιότητας των σχεδίων εκτέλεσης. Τα φιλτραρισμένα ευρετήρια μπορούν επίσης να αναδημιουργηθούν ηλεκτρονικά. Δοκιμάστε το με μια ευρετηριασμένη προβολή.

Και πάλι λίγο από τον μεταφραστή

Ο σκοπός της εμφάνισης αυτής της μετάφρασηςστις σελίδες του Habrahabr ήταν για να σας πω ή να σας υπενθυμίσω για το ιστολόγιο SimpleTalk από RedGate.
Δημοσιεύει πολλές διασκεδαστικές και ενδιαφέρουσες αναρτήσεις.
Δεν είμαι συνδεδεμένος με προϊόντα της εταιρείας RedGate, ούτε με την πώλησή τους.

Όπως υποσχέθηκε, βιβλία για όσους θέλουν να μάθουν περισσότερα
Προτείνω τρία πολύ καλά βιβλία από τον εαυτό μου (οι σύνδεσμοι οδηγούν σε ανάπτωεκδόσεις στο κατάστημα Αμαζόνα):

Κατ 'αρχήν, μπορείτε να ανοίξετε απλά ευρετήρια Προσθήκη ετικετών
Microsoft SQL Server 2012 T-SQL Fundamentals (Αναφορά προγραμματιστή)
Συγγραφέας Itzik Ben-Gan
Ημερομηνία δημοσίευσης: 15 Ιουλίου 2012
Ο συγγραφέας, μάστορας της τέχνης του, δίνει ΒΑΣΙΚΕΣ ΓΝΩΣΕΙΣσχετικά με την εργασία με βάσεις δεδομένων.
Αν τα έχετε ξεχάσει όλα ή δεν τα μάθατε ποτέ, σίγουρα αξίζει να το διαβάσετε.

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

ROWIDείναι μια ψευδό-στήλη που είναι ένα μοναδικό αναγνωριστικό για μια σειρά σε έναν πίνακα και στην πραγματικότητα περιγράφει την ακριβή φυσική θέση της συγκεκριμένης σειράς. Με βάση αυτές τις πληροφορίες Μαντείομπορεί στη συνέχεια να βρει τα δεδομένα που σχετίζονται με τη σειρά του πίνακα. Κάθε φορά που μια σειρά μετακινείται, εξάγεται, εισάγεται ή οποιαδήποτε άλλη λειτουργία που αλλάζει τη θέση της, η ROWIDγραμμή γιατί καταλαμβάνει διαφορετική φυσική θέση. Για αποθήκευση δεδομένων ROWIDΑπαιτούνται 80 bit (10 byte). Αναγνωριστικά ROWIDαποτελείται από τέσσερα στοιχεία: αριθμός αντικειμένου (32 bit), σχετικός αριθμός αρχείου (10 bit), αριθμός μπλοκ (22 bit) και αριθμός γραμμής (16 bit). Αυτά τα αναγνωριστικά εμφανίζονται ως ακολουθίες 18 χαρακτήρων που υποδεικνύουν τη θέση των δεδομένων στη βάση δεδομένων, με κάθε χαρακτήρα να αναπαρίσταται σε μορφή βάσης-64, που αποτελείται από χαρακτήρες Α-Ζ, a-z, 0-9, + και /. Οι πρώτοι έξι χαρακτήρες είναι ο αριθμός του αντικειμένου δεδομένων, οι επόμενοι τρεις είναι ο σχετικός αριθμός αρχείου, οι επόμενοι έξι είναι ο αριθμός του μπλοκ και οι τρεις τελευταίοι είναι ο αριθμός γραμμής.

Παράδειγμα:

ΕΠΙΛΟΓΗ οικογένειας, ROWIDΑΠΟ μαθητή?

FAM ROWID

——————————————

IVANOV AAAA3kAAGAAAAGsAAA

PETROV AAAA3kAAGAAAAGsAAB

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

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

Η χρήση ευρετηρίων για την αναζήτηση πληροφοριών σε πίνακες μπορεί να προσφέρει σημαντικές βελτιώσεις στην απόδοση σε σχέση με τη σάρωση πινάκων των οποίων οι στήλες δεν έχουν ευρετηριαστεί. Ωστόσο, η επιλογή του σωστού δείκτη δεν είναι καθόλου εύκολη. Φυσικά, μια στήλη της οποίας οι τιμές είναι όλες μοναδικές είναι προτιμότερη για ευρετηρίαση με δείκτη B-tree, αλλά μια στήλη που δεν πληροί αυτές τις απαιτήσεις είναι καλή υποψήφια, εφόσον περίπου το 10% των σειρών της περιέχουν πανομοιότυπες τιμές και όχι περισσότερο. Οι στήλες "Switch" ή "flag", για παράδειγμα αυτές που αποθηκεύουν πληροφορίες σχετικά με το φύλο ενός ατόμου, δεν είναι κατάλληλες για ευρετήρια B-tree. Στήλες που χρησιμοποιούνται για την αποθήκευση ενός μικρού αριθμού "αξιόπιστων τιμών", καθώς και εκείνων που αποθηκεύουν ορισμένες τιμές, επίσης, δεν είναι κατάλληλες. τότε τα σημάδια, για παράδειγμα, "αξιοπιστία" ή "αναξιοπιστία", "δραστηριότητα" ή "αδράνεια", "ναι" ή "όχι", κ.λπ., κ.λπ. Τέλος, τα ευρετήρια με αντίστροφα πλήκτρα είναι χρησιμοποιείται, κατά κανόνα, όπου είναι εγκατεστημένο και λειτουργεί ΜαντείοΠαράλληλος διακομιστής και πρέπει να αυξήσετε το επίπεδο παραλληλισμού στη βάση δεδομένων στο μέγιστο.

Αρχικά, σας προτείνω να καταλάβετε τι είναι ευρετήριο κάλυψης, θα δώσω ένα απόσπασμα από ένα άρθρο στο Habré:

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

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

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

Έτσι, το καλυπτικό ευρετήριο δεν πρέπει να περιέχει όλες τις επιλέξιμες στήλες του ερωτήματος στη δομή του δέντρου ευρετηρίου, αλλά μόνο εκείνες που θα χρησιμοποιηθούν για το φιλτράρισμα ή την ομαδοποίηση των δεδομένων στο ερώτημα. Οι υπόλοιπες στήλες από την ενότητα SELECT θα πρέπει να τοποθετηθούν στο ΠΕΡΙΛΑΜΒΑΝΕΙ την ενότητα του ευρετηρίου.

Ίσως σας φανεί χρήσιμη η απάντηση από μια άλλη ερώτηση.

Το παραπάνω παράδειγμα χρησιμοποιεί ένα σύνθετο ευρετήριο 3 πεδίων αντί για ένα ευρετήριο κάλυψης, ο κώδικας για τη δημιουργία του ευρετηρίου κάλυψης θα μοιάζει με αυτό:

ΔΗΜΙΟΥΡΓΙΑ ΜΗ ΣΥΓΚΕΚΡΙΜΕΝΟΥ ΕΥΡΕΤΗΡΙΟΥ ΣΤΟ . ( ASC) ΠΕΡΙΛΑΜΒΑΝΕΙ (, ) ΜΕ (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ALLOW_ROW_LOCKS = OFF_ROW_LOCKS)

Για να απαντήσω στην ερώτησή σας:

για ένα ευρετήριο κάλυψης, η σειρά των στηλών στην ενότητα ΠΕΡΙΛΑΜΒΑΝΕΙ ΟΧΙ σημαντικο, αλλά η σειρά των στηλών είναι σημαντική για ένα σύνθετο ευρετήριο, επειδή Τα δεδομένα στηλών τοποθετούνται στο δέντρο ευρετηρίου με τη σειρά που αναφέρονται οι στήλες και το εργαλείο βελτιστοποίησης ερωτημάτων δεν θα μπορεί να χρησιμοποιήσει ένα ευρετήριο 2 στηλών για να αναζητήσει τις τιμές μόνο 2 στηλών. Μπορείτε να δείτε ένα σαφές παράδειγμα για το πώς θα φαίνεται η δομή του ευρετηρίου των 2 στηλών (EMPLOYEE_ID, SUBSIDIARY_ID) στο σχήμα.

1) Έννοια του δείκτη
Δείκτηςείναι ένα εργαλείο που παρέχει γρήγορη πρόσβαση σε σειρές πίνακα με βάση τις τιμές μιας ή περισσότερων στηλών.

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

2) Δημιουργία ευρετηρίων
ΔΗΜΙΟΥΡΓΙΑ ΕΥΡΕΤΗΡΙΟΥ
ΕΠΙ()

3) Αλλαγή και διαγραφή ευρετηρίων
Για τον έλεγχο της δραστηριότητας του ευρετηρίου, χρησιμοποιείται ο τελεστής:
ΑΛΛΑΓΗ ΔΕΙΚΤΗ
Για να αφαιρέσετε ένα ευρετήριο, χρησιμοποιήστε τον τελεστή:
ΔΕΙΚΤΗΣ ΠΤΩΣΗΣ

α) Κανόνες επιλογής πίνακα
1. Συνιστάται η ευρετηρίαση πινάκων στους οποίους έχει επιλεγεί όχι περισσότερο από το 5% των σειρών.
2. Οι πίνακες που δεν έχουν διπλότυπα στην πρόταση WHERE της πρότασης SELECT θα πρέπει να είναι ευρετηριασμένοι.
3. Δεν είναι πρακτικό να ευρετηριάζετε πίνακες που ενημερώνονται συχνά.
4. Είναι ακατάλληλο να δημιουργείτε ευρετήριο σε πίνακες που δεν καταλαμβάνουν περισσότερες από 2 σελίδες (για την Oracle αυτό είναι μικρότερο από 300 σειρές), καθώς η πλήρης σάρωση δεν διαρκεί περισσότερο.

β) Κανόνες επιλογής στηλών
1. Κύρια και ξένα κλειδιά - χρησιμοποιούνται συχνά για τη σύνδεση πινάκων, την ανάκτηση δεδομένων και την αναζήτηση. Αυτά είναι πάντα μοναδικά ευρετήρια με μέγιστη χρησιμότητα
2. Όταν χρησιμοποιείτε επιλογές ακεραιότητας αναφοράς, χρειάζεστε πάντα ένα ευρετήριο στο FK.
3. Στήλες βάσει των οποίων τα δεδομένα ταξινομούνται συχνά και/ή ομαδοποιούνται.
4. Στήλες που αναζητούνται συχνά στον όρο WHERE μιας πρότασης SELECT.
5. Δεν πρέπει να δημιουργείτε ευρετήρια σε μεγάλες περιγραφικές στήλες.

γ) Αρχές δημιουργίας σύνθετων ευρετηρίων
1. Τα σύνθετα ευρετήρια είναι καλά εάν οι μεμονωμένες στήλες έχουν λίγες μοναδικές τιμές, αλλά ένα σύνθετο ευρετήριο παρέχει περισσότερη μοναδικότητα.
2. Εάν όλες οι τιμές που επιλέγονται από τη δήλωση SELECT ανήκουν σε ένα σύνθετο ευρετήριο, τότε οι τιμές επιλέγονται από το ευρετήριο.
3. Θα πρέπει να δημιουργηθεί ένας σύνθετος δείκτης εάν η ρήτρα WHERE χρησιμοποιεί δύο ή περισσότερες τιμές σε συνδυασμό με τον τελεστή AND.

δ) Δεν συνιστάται η δημιουργία
Δεν συνιστάται η δημιουργία ευρετηρίων σε στήλες, συμπεριλαμβανομένων των σύνθετων, που:
1. Χρησιμοποιείται σπάνια για αναζήτηση, συγχώνευση και ταξινόμηση αποτελεσμάτων ερωτημάτων.
2. Περιέχει τιμές που αλλάζουν συχνά, κάτι που απαιτεί συχνές ενημερώσειςευρετήριο επιβραδύνει την απόδοση της βάσης δεδομένων.
3. Περιέχει έναν μικρό αριθμό μοναδικών τιμών (λιγότερο από 10% m/f) ή έναν κυρίαρχο αριθμό γραμμών με μία ή δύο τιμές (η πόλη κατοικίας του προμηθευτή είναι η Μόσχα).
4. Οι συναρτήσεις ή μια έκφραση εφαρμόζονται σε αυτές στον όρο WHERE και το ευρετήριο δεν λειτουργεί.

ε) Δεν πρέπει να ξεχνάμε
Θα πρέπει να προσπαθήσετε να μειώσετε τον αριθμό των ευρετηρίων, καθώς ένας μεγάλος αριθμός ευρετηρίων μειώνει την ταχύτητα ενημέρωσης δεδομένων. Έτσι, ο MS SQL Server συνιστά τη δημιουργία όχι περισσότερων από 16 ευρετηρίων ανά πίνακα.
Συνήθως, τα ευρετήρια δημιουργούνται για σκοπούς ερωτημάτων και για τη διατήρηση της ακεραιότητας αναφοράς.
Εάν το ευρετήριο δεν χρησιμοποιείται για ερωτήματα, τότε θα πρέπει να διαγραφεί και να διασφαλιστεί η ακεραιότητα αναφοράς με χρήση κανόνων.