Ευρετήρια MS sql. Διακομιστής Sql - Έχει σημασία η παραγγελία κατά τη δημιουργία ενός ευρετηρίου κάλυψης στο Microsoft SQL; Σταθερές υπολογισμένες στήλες

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

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

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

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

--Για κάποιο λόγο, ένας ομαδοποιημένος δείκτης τείνει να τρέχει πιο γρήγορα από έναν μη συμπλεγματοποιημένο ευρετήριο. Όταν το σύστημα σαρώνει ένα ομαδοποιημένο ευρετήριο, δεν χρειάζεται να αφήσετε τη δομή B-tree για να σαρώσει σελίδες δεδομένων, επειδή τέτοιες σελίδες υπάρχουν ήδη στο επίπεδο φύλλου του δέντρου.

--Ένας μη ομαδοποιημένος ευρετήριο απαιτεί επίσης περισσότερες λειτουργίες εισόδου/εξόδου από το αντίστοιχο ευρετήριο συμπλέγματος.

--Το μη ομαδοποιημένο ευρετήριο πρέπει να διαβάσει τις σελίδες δεδομένων μετά τη σάρωση του δέντρου Β ή, εάν υπάρχει ομαδοποιημένο ευρετήριο σε άλλη στήλη(εις) του πίνακα, ο μη ομαδοποιημένος ευρετήριο πρέπει να διαβάσει τη δομή Β-δέντρου του συμπλέγματος ευρετηρίου .

--Έτσι, ένα συμπλεγμένο ευρετήριο θα είναι σημαντικά ταχύτερο από μια σάρωση πίνακα, ακόμα κι αν η επιλεκτικότητά του είναι αρκετά χαμηλή (το ερώτημα επιστρέφει πολλές σειρές)

ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑ tsql.dbo.NI
ID int NOT NULL,
T char(8) NULL
);

ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑ tsql.dbo.NCI
ID int NOT NULL,
T char(8) NULL
);

--Δημιουργήστε ένα ευρετήριο συμπλέγματος

ΔΗΜΙΟΥΡΓΙΑ ΣΥΓΚΕΝΤΡΩΜΕΝΟΥ ΕΥΡΕΤΗΡΙΟΥ IX_1
ON tsql.dbo.NCI(ID);

--Δημιουργήστε ένα μη ομαδοποιημένο ευρετήριο σε έναν πίνακα

ΔΗΜΙΟΥΡΓΙΑ ΜΗ ΣΥΓΚΕΚΡΙΜΕΝΟΥ ΕΥΡΕΤΗΡΙΟΥ IX_2
ON tsql.dbo.NCI(T);

--Προσθήκη δεδομένων δοκιμής
ΔΗΛΩΣΤΕ @i INT = 100000;
ΔΗΛΩΣΤΕ @t CHAR(1) = "T";

ΕΝΩ @i > 0
ΑΡΧΙΖΟΥΝ
εισαγάγετε στις τιμές tsql.dbo.NI(@i, @t + CAST(@i AS char(6)));
εισαγάγετε στις τιμές tsql.dbo.NCI(@i, @t + CAST(@i AS char(6)));
ΣΕΤ @i -= 1;
ΤΕΛΟΣ

--Ερωτήματα σε πίνακα με ευρετήρια
SELECT ID, T FROM tsql.dbo.NCI
ΠΑΡΑΓΓΕΛΙΑ ΜΕ ΤΑΥΤΟΤΗΤΑ Τ

SELECT ID, COUNT(*) AS C FROM tsql.dbo.NCI
ΟΜΑΔΑ ΚΑΤΑ ID, Τ

SELECT ID, T FROM tsql.dbo.NCI
ΟΠΟΥ ID > 4000 ΚΑΙ Α.Δ.Τ< 55000 AND T LIKE "T%"

--Ερώτημα χρησιμοποιώντας και τα δύο ευρετήρια
ΧΡΗΣΗ tsql;
ΕΠΙΛΕΞΤΕ ΚΑΣΤ (dbo.NCI.ID AS VARCHAR)
ΑΠΟ dbo.NCI
ΟΜΑΔΑ ΚΑΤΑ dbo.NCI.ID
ΕΝΩΣΗ ΟΛΩΝ
ΕΠΙΛΟΓΗ dbo.NCI.T
ΑΠΟ dbo.NCI
ΟΜΑΔΑ ΑΠΟ dbo.NCI.T

--Πληροφορίες δεικτών
SELECT index_type_desc, index_depth, index_level,
page_count, record_count
ΑΠΟ sys.dm_db_index_physical_stats
(DB_ID(N"tsql"), OBJECT_ID(N"dbo.NCI"), NULL, NULL , "DETAILED");

--Διαγραφή ευρετηρίων
ΑΝ ΥΠΑΡΧΕΙ (ΕΠΙΛΟΓΗ ονόματος ΑΠΟ sys.indexes
WHERE όνομα = N"IX_1")
ΑΠΟΣΤΟΛΗ ΕΥΡΕΤΗΡΙΟΥ IX_1 ΣΤΟ tsql.dbo.NCI;

ΑΝ ΥΠΑΡΧΕΙ (ΕΠΙΛΟΓΗ ονόματος ΑΠΟ sys.indexes
Όνομα WHERE = N"IX_2")
ΑΠΟΣΤΟΛΗ ΕΥΡΕΤΗΡΙΟΥ IX_2 ΣΤΟ tsql.dbo.NCI;

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

Επιτρέψτε μου να σας υπενθυμίσω τον ορισμό του σχήματος πίνακα Staffs με τον οποίο θα εργαστούμε:

Τραπέζι προσωπικού

Ας υποθέσουμε ότι πρέπει να δημιουργήσουμε ένα μη συμπλεγμένο ευρετήριο για τον πίνακα Staffs, το οποίο θα βελτιστοποιήσει το ακόλουθο ερώτημα:

ΕΠΙΛΕΞΤΕ Ταυτότητα, Όνομα, Εργασία ΑΠΟ πράγματα ΟΠΟΥ ΜΙΣΘΟΣ > 1000 ΚΑΙ ΦΩΤΟ ΔΕΝ ΕΙΝΑΙ ΜΗ ΜΗΧΑΝΗ

Το κλειδί ευρετηρίου θα είναι οι στήλες ΜΙΣΘΟΣ και Φωτογραφία, καθώς η επιλογή φιλτράρεται από αυτά τα πεδία. Και οι στήλες Id, Name και Job θα είναι οι στήλες που περιλαμβάνονται στο ευρετήριο.

Η γενική σύνταξη εντολών είναι η εξής:

ΧΡΗΣΗ ΠΗΓΑΙΝΩ

ΔΗΜΙΟΥΡΓΙΑ ΜΗ ΣΥΓΚΕΚΡΙΜΕΝΟΥ ΔΕΙΚΤΗ ΕΠΙ (ASC -- στήλες κλειδιού ευρετηρίου)

ΠΕΡΙΛΑΜΒΑΝΩ ( -- περιλαμβάνονται στήλες) GO

Στην περίπτωσή μας, το αίτημα θα μοιάζει με αυτό:

(Μισθός, Φωτογραφία) ΠΕΡΙΛΑΜΒΑΝΟΝΤΑΙ (Id, Όνομα, Θέση εργασίας) GO

Δημιουργήσαμε ένα μη ομαδοποιημένο ευρετήριο. Ή μάλλον, ένας μη ομαδοποιημένος καλυπτικός δείκτης. Αυτό σημαίνει ότι το ευρετήριο περιέχει όλα τα πεδία που είναι απαραίτητα για την εκτέλεση του ερωτήματος και ο SQL Server δεν θα έχει πρόσβαση στον βασικό πίνακα κατά την εκτέλεση του ερωτήματος.

Αν ο κωδικός μας ήταν έτσι:

ΔΗΜΙΟΥΡΓΙΑ ΜΗ ΣΥΜΠΛΗΡΩΜΕΝΟ ΕΥΡΕΤΗΡΙΟ IDX_StaffsΑναζήτηση σε πράγματα

(Μισθός, Φωτογραφία) ΠΕΡΙΛΑΜΒΑΝΟΝΤΑΙ (Id) GO

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

Το ευρετήριο συμπλέγματος δημιουργείται χρησιμοποιώντας την ακόλουθη εντολή:

ΔΗΜΙΟΥΡΓΙΑ ΣΥΜΠΛΗΡΩΜΕΝΟΥ ΕΥΡΕΤΗΡΙΟΥ IDX_Stsffsid ON Stuffs (Id)

Εδώ δημιουργήθηκε ένα μοναδικό ευρετήριο συμπλέγματος με βάση το πρωτεύον κλειδί του πίνακα (στήλη Id).

Πραγματικό παράδειγμα

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

Ας δημιουργήσουμε μια νέα βάση δεδομένων:

ΔΗΜΙΟΥΡΓΙΑ ΒΑΣΗΣ ΔΕΔΟΜΕΝΩΝ TestDB.

Και ένας ενιαίος πίνακας πελατών, ο οποίος θα αποτελείται από τέσσερις στήλες:

ΔΗΜΙΟΥΡΓΗΣΤΕ ΠΙΝΑΚΑ .(

NOT NULL, NULL, NULL, NULL) GO

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

ΔΗΛΩΣΤΕ @i int = 0;

Καθώς εγώ< 500000) BEGIN INSERT INTO Customers(Id, Num1, Num2, Num3) VALUES(

@i, abs(checksum(newid())), abs(checksum(newid())), abs(checksum(newid())) SET @i = @i + 1; ΤΕΛΟΣ

Αυτό το σενάριο προσθέτει μισό εκατομμύριο εγγραφές στον πίνακα, επομένως να είστε υπομονετικοί, το σενάριο θα εκτελεστεί για τουλάχιστον 3 λεπτά.

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

Για να ενεργοποιήσετε τη λειτουργία συλλογής στατιστικών στοιχείων, πρέπει να εκτελέσετε την ακόλουθη εντολή:

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

Μας ενδιαφέρει μόνο η τιμή της παραμέτρου λογικής ανάγνωσης.

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

1) SELECT Id, Num1, Num2 FROM Customers WHERE Id = 2000

2) SELECT Id, Num1, Num2 FROM Customers WHERE Id >= 0 AND Id< 1000

3) SELECT Id, Num1, Num2 FROM Customers WHERE Id >= 0 AND Id< 5000

Αυτά τα ερωτήματα θα επιστρέψουν 1 σειρά, 1000 σειρές και 5000 σειρές, αντίστοιχα. Χωρίς ευρετήρια, ο δείκτης απόδοσης (αριθμός λογικών αναγνώσεων) για όλα τα ερωτήματα είναι ο ίδιος και ίσος με 1621. Ας εισαγάγουμε τα δεδομένα στον πίνακα αποτελεσμάτων:

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

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

Αρχικά, ας διαγράψουμε το προηγούμενο ευρετήριο:

ΧΡΗΣΗ TestDB GO DROP INDEX Customers.TestIndex1

Και ας δημιουργήσουμε ένα νέο ευρετήριο:

ΔΗΜΙΟΥΡΓΙΑ ΜΗ ΣΥΜΠΛΗΡΩΜΕΝΟΥ ΕΥΡΕΤΗ TestIndex2 ON dbo.Customers(Id) INCLUDE (Num1, Num2);

Τώρα ας εκτελέσουμε τα ερωτήματά μας για τρίτη φορά και ας γράψουμε τα αποτελέσματα σε έναν πίνακα:

Χωρίς ευρετήρια

Μη κάλυψη ευρετηρίου

Ευρετήριο κάλυψης

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

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

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

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

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

Χρήσιμα ευρετήρια

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

Για παράδειγμα, τα ακόλουθα ερωτήματα σε σχέση με τη βάση δεδομένων Northwind θα εκτελούνται πιο αποτελεσματικά κατά τη δημιουργία ενός ευρετηρίου στη στήλη UnitPrice.

Διαγραφή από προϊόντα όπου UnitPrice=1
Επιλέξτε * από τα προϊόντα όπου Τιμή μονάδας μεταξύ 14 και 16

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

Επιλέξτε * Από παραγγελία προϊόντων ανά UnitPrice ASC

Η ομαδοποίηση μιας εγγραφής χρησιμοποιώντας την Ομάδα κατά δήλωση απαιτεί επίσης συχνά ταξινόμηση, επομένως η δημιουργία ενός ευρετηρίου στη στήλη UnitPrice θα είναι επίσης χρήσιμη για το επόμενο ερώτημα που μετράει τον αριθμό των μονάδων ενός προϊόντος σε κάθε συγκεκριμένη τιμή

Επιλέξτε πλήθος(*), UnitPrice From Products Group ανά UnitPrice

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

Μειονεκτήματα της ευρετηρίασης

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

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

Δημιουργία Βέλτιστου Δείκτη

Απλός ευρετήριο

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

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

Επιλεκτικός δείκτης

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

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

Καλυπτικοί δείκτες

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

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

Επιλέξτε Count(*), UnitPrice From Products Group by UnitPrice

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

Ευρετήριο συμπλέγματος

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

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

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

συμπέρασμα

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

Ένας από τους πιο σημαντικούς τρόπους για την επίτευξη υψηλής παραγωγικότητας 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αναδημιουργεί το ευρετήριο που μόλις δημιουργήσαμε:
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, a-z, 0-9, + και /. Οι πρώτοι έξι χαρακτήρες είναι ο αριθμός του αντικειμένου δεδομένων, οι επόμενοι τρεις είναι ο σχετικός αριθμός αρχείου, οι επόμενοι έξι είναι ο αριθμός του μπλοκ και οι τρεις τελευταίοι είναι ο αριθμός γραμμής.

    Παράδειγμα:

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

    FAM ROWID

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

    IVANOV AAAA3kAAGAAAAGsAAA

    PETROV AAAA3kAAGAAAAGsAAB

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

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

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