Δυναμικός Κατακερματισμός Καλό για βάση δεδομένων που μεγαλώνει και συρρικνώνεται σε μέγεθος Επιτρέπει τη δυναμική τροποποίηση της συνάρτησης κατακερματισμού Επεκτάσιμος κατακερματισμός μια μορφή δυναμικού κατακ/σμού Η συνάρτηση Hash παράγει τιμές σε ένα μεγάλο εύρος - συνήθως ακέραιοι b-bit, με b = 32. Οποιαδήποτε στιγμή χρησιμοποιούμε μόνο ένα πρόθεμα της συνάρτησης κατακερματισμού για να ευρετηριάζουμε σε έναν πίνακα διευθύνσεων κάδων Έστω το μήκος προθέματος i bits, 0 i 32. Μέγεθος πίνακα διευθύνσεων κάδου = 2 i. Αρχικά i = 0 Η τιμή του i αυξάνεται και μειώνεται καθώς το μέγεθος της βάσης δεδομένων μεγαλώνει και μικραίνει. Πολλαπλές καταχωρήσεις στον πίνακα διευθύνσεων κάδου μπορεί να δείχνουν έναν κουβά (γιατί;) Έτσι, ο πραγματικός αριθμός κάδων είναι < 2 i Ο αριθμός των κάδων μεταβάλλεται επίσης δυναμικά λόγω της συσσωματώσεως και του διαχωρισμού των κάδων. 11.51
Γενική δομή επεκτάσιμου κατακερματισμού Στη δομή αυτή, i 2 = i 3 = i, ενώ i 1 = i 1 (επόμενο slide) 11.52
Χρήση της επεκτάσιμης δομής Hash Κάθε κάδος j αποθηκεύει μια τιμή i j Όλες οι καταχωρήσεις που δείχνουν στον ίδιο κάδο έχουν τις ίδιες τιμές στα πρώτα i j bits. Για να εντοπίσουμε τον κάδο που περιέχει το κλειδί αναζήτησης K j : 1. Υπολογίζουμε h(k j ) = X 2. Χρησ/με τα i πρώτα bits του X για τη θέση στον πίνακα δ/σεων κάδων και ακολουθούμε το δείκτη στον κάδο Για εισαγωγή εγγραφής με τιμή κλειδιού αναζήτησης K j ακολουθούμε την ίδια διαδικασία με την αναζήτηση και εντοπίζουμε τον κάδο, ας πούμε j. Αν υπάρχει χώρος στον κάδο j, εισάγουμε την εγγραφή. Αλλιώς ο κάδος πρέπει να χωριστεί και η εισαγωγή να επιχειρηθεί ξανά Κάδοι υπερχείλισης χρησιμοποιούνται σε ορισμένες περιπτώσεις 11.53
Εισαγωγή στην επεκτάσιμη δομή Hash Για να διαιρέσετε ένα κουβά j κατά την εισαγωγή της εγγραφής με την τιμή κλειδιού αναζήτησης K j : Αν i > i j (περισσότερους από έναν δείκτες στον κάδο j) Δημιουργούμε ένα νέο κουβά z, και ορίζουμε i j = i z = (i j + 1) Ενημερώνουμε το δεύτερο μισό των καταχωρήσεων του πίνακα διευθύνσεων του κάδου που αρχικά έδειχναν στο j, να δείχνουν στο z αφαιρούμε κάθε εγγραφή στον κάδο j και τις ξαναβάζουμε (στο j ή z) Επαναϋπολογίστε νέο κάδο για το K j και εισάγετε την εγγραφή στον κάδο (περαιτέρω διαχωρισμός απαιτείται εάν ο κάδος είναι ακόμα γεμάτος) Αν i = i j (μόνο ένας δείκτης στον κάδο j) Αν το i φτάσει κάποιο όριο b, ή πάρα πολλές διασπάσεις έχουν συμβεί σε αυτή την εισαγωγή, δημιουργήστε έναν κουβά υπερχείλισης Αλλιώς Αυξάνουμε το i και διπλασιάζουμε το μέγεθος του πίνακα διευθύνσεων κάδων. Αντικαθιστούμε κάθε καταχώρηση στον πίνακα με δύο καταχωρίσεις που δείχνουν στον ίδιο κάδο. Επαναϋπολογίστε νέα δ/ση πίνακα κάδων για το K j τώρα i > i j άρα χρησιμοποιούμε τον 1 η περίπτωση. 11.54
Διαγραφή στην επεκτάσιμη δομή Hash Για να διαγράψουμε μια τιμή κλειδιού εντοπίστε το στον κάδο και αφαιρέστε το. Ο ίδιος ο κάδος μπορεί να αφαιρεθεί αν γίνει κενός (με τις κατάλληλες ενημερώσεις στον πίνακα διευθύνσεων του κάδου). Μπορεί να γίνει συγχώνευση κουβάδων (μπορεί να συμπυκνωθεί μόνο με έναν κάδο "buddy" που έχει την ίδια τιμή i j και ίδιο πρόθεμα i j 1, αν υπάρχει) Είναι επίσης δυνατή η μείωση του μεγέθους του πίνακα διευθύνσεων του κάδου Σημείωση: Το μειούμενο μέγεθος του πίνακα διευθύνσεων του κάδου είναι μια δαπανηρή διαδικασία και θα πρέπει να γίνεται μόνο εάν ο αριθμός των κουβάδων είναι πολύ μικρότερος από το μέγεθος του πίνακα 11.55
Παράδειγμα 11.56
Example (Cont.) Αρχική δομή Hash, μέγεθος bucket = 2 11.57
Example (Cont.) Δομή Hash μετά την εισαγωγή Mozart, Srinivasan, και Wu 11.58
Example (Cont.) Δομή Hash μετά την εισαγωγή του «Einstein» 11.59
Example (Cont.) Δομή Hash μετά την εισαγωγή των Gold και El Said 11.60
Example (Cont.) Δομή Hash μετά την εισαγωγή του Katz 11.61
Example (Cont.) Δομή μετά την εισαγωγή 11 εγγραφών 11.62
Example (Cont.) Και μετά την εισαγωγή του Kim στην προηγούμενη δομή 11.63
Επεκτάσιμος Κατακερματισμός ως προς άλλες μεθόδους Πλεονεκτήματα του επεκτάσιμου hashing: Η απόδοση δεν μειώνεται με το μέγεθος του αρχείου Ελάχιστη επιβάρυνση σε χώρο Μειονεκτήματα του επεκτάσιμου hashing Επιπλέον επίπεδο ανακατεύθυνσης για την εύρεση των εγγραφών Ο πίνακας διεύθυνσης κάδου μπορεί να γίνει πολύ μεγάλος (μεγαλύτερος από τη μνήμη) Δεν είναι δυνατή η διάθεση πολύ μεγάλων συνεχών περιοχών ούτε στο δίσκο Λύση: B+ δέντρο για τον εντοπισμό της επιθυμητής εγγραφής στον πίνακα διευθύνσεων του κάδου Η αλλαγή μεγέθους του πίνακα διευθύνσεων είναι δαπανηρή Το γραμμικό hashing είναι μια εναλλακτική Επιτρέπει σταδιακή αύξηση του καταλόγου της με κόστος περισσότερων υπερχειλίσεων bucket 11.64
Σύγκριση ταξινομημένου ευρετηρίου και Κατακερματισμού Κόστος περιοδικής αναδιοργάνωσης Σχετική συχνότητα εισαγωγών και διαγραφών Είναι επιθυμητό να βελτιστοποιηθεί ο μέσος χρόνος πρόσβασης σε βάρος του χρόνου πρόσβασης χειρότερης περίπτωσης; Αναμενόμενοι τύποι ερωτημάτων: Το Hashing είναι γενικά καλύτερο κατά την ανάκτηση εγγραφών με καθορισμένη τιμή του κλειδιού. Εάν τα ερωτήματα εύρους είναι αρκετά, τα ταξ/μένα ευρετήρια πρέπει να προτιμώνται Στην πράξη: Η PostgreSQL υποστηρίζει κατακερματισμό, αλλά αποθαρρύνει τη χρήση τους λόγω της κακής απόδοσης Η Oracle υποστηρίζει τη στατική οργάνωση κατακερματισμού, αλλά όχι δείκτες κατακερματισμού Ο SQLServer υποστηρίζει μόνο B + -trees 11.65
Ευρετήρια Bitmap Τα ευρετήρια Bitmap είναι ένας ειδικός τύπος ευρετηρίου για αποτελεσματική αναζήτηση σε πολλαπλά κλειδιά Οι Εγγραφές σε μια σχέση αριθμούνται διαδοχικά από, ας πούμε, το 0 Δεδομένου αριθμού n, είναι εύκολη η ανάκτηση της εγγραφής n Ιδιαίτερα εύκολο εάν οι εγγραφές είναι σταθερού μεγέθους Ισχύει για χαρακτηριστικά που λαμβάνουν σχετικά μικρό αριθμό ξεχωριστών τιμών Π.χ. φύλο, χώρα, κράτος,... Π.χ. εισόδημα (χωρίζεται σε μικρό αριθμό επιπέδων 0-9999, 10000-19999, 20000-50000, 50000- άπειρο) Ένα bitmap είναι απλά ένας πίνακας από bits 11.66
Ευρετήρια Bitmap Στην απλούστερη μορφή του, ένα ευρετήριο bitmap σε ένα χαρακτηριστικό έχει ένα bitmap για κάθε τιμή του χαρακτηριστικού Το κάθε bitmap έχει όσα bits όσα οι εγγραφές Σε ένα bitmap για την τιμή v, το bit για μια εγγραφή είναι 1 αν η εγγραφή έχει την τιμή v για το χαρακτηριστικό και 0 διαφορετικά 11.67
Ευρετήρια Bitmap Τα bitmap είναι χρήσιμα για ερωτήματα σε πολλαπλά χαρακτηριστικά Δεν είναι ιδιαίτερα χρήσιμα για ερωτήματα μεμονωμένων χαρακτηριστικών Τα ερωτήματα απαντώνται χρησιμοποιώντας λειτουργίες bitmap Τομή (και) Ένωση (ή) Συμπλήρωση (όχι) Κάθε λειτουργία λαμβάνει δύο bitmaps του ίδιου μεγέθους και εφαρμόζει τη λειτουργία για τα αντίστοιχα δυαδικά ψηφία για να πάρει το αποτέλεσμα bitmap Π.χ. 100110 AND 110011 = 100010 100110 OR 110011 = 110111 NOT 100110 = 011001 Males με εισόδημα L1: 10010 AND 10100 = 10000 Στη συνέχεια ανακτούμε τις απαιτούμενες πλειάδες. Η καταμέτρηση του αριθμού των πλειάδων που ταιριάζουν είναι ακόμη πιο γρήγορη 11.68
Ευρετήρια Bitmap Τα bitmap είναι γενικά πολύ μικρά σε σχέση με το μέγεθος της σχέσης Π.χ. εάν η εγγραφή είναι 100 bytes, ο χώρος για ένα μόνο bitmap είναι 1/800 του χώρου που χρησιμοποιείται από τη σχέση. Αν ο αριθμός των ξεχωριστών τιμών χαρακτηριστικών είναι 8, το bitmap είναι μόνο το 1% του μεγέθους της σχέσης Η διαγραφή πρέπει να γίνεται σωστά Bitmap ύπαρξης για να σημειώνεται εάν υπάρχει έγκυρη εγγραφή σε μια θέση εγγραφής Απαραίτητο για συμπλήρωση not(a=v): (NOT bitmap-a-v) AND ExistenceBitmap Θα πρέπει να διατηρούμε bitmap για όλες τις τιμές, ακόμη και το null Για σωστή επεξεργασία SQL null στο NOT(A=v): τομή του παραπάνω με το (NOT bitmap-a-null) 11.69
Ορισμός ευρετηρίων στην SQL Δημιουργία create index <index-name> on <relation-name> (<attribute-list>) Π.χ.: create index b-index on branch(branch_name) Διαγραφή drop index <index-name> Τα περισσότερα συστήματα βάσεων δεδομένων επιτρέπουν να προσδιοριστεί ο τύπος ευρετηρίου και η ομαδοποίηση. 11.70
End of Chapter Database System Concepts, 6 th Ed. See www.db-book.com for conditions on re-use