230 likes | 345 Views
Indexes à Arbres et Indexes à Hachage. Sections sélectionnées du Chapitre 10. Introduction. Rappel des 3 alternatives d’entrées des données k* : un enregistrement de données avec une valeur de clé k une paire < k , rid> une paire < k , liste de rids>
E N D
Indexes à Arbres et Indexes à Hachage Sections sélectionnées du Chapitre 10
Introduction • Rappel des 3 alternatives d’entrées des données k*: • un enregistrement de données avec une valeur de clé k • une paire <k, rid> • une paire <k, liste de rids> • Les indexes à arbres supportent à la fois la recherche des plages de valeurs (‘’range search’’) ainsi que les recherches d’egalités (‘’equality search’’). • ISAM: structure statique;B+ tree: dynamique, s’ajuste gracieusement aux insertions et effacements. • Indexes à Hachage : meilleurs pour les recherches d’égalité; ne peuvent supporter les recherches des valeurs des plages.
Intuition Derrière les Indexes à Arbres • ``Trouvez tous les étudiants avec un gpa > 3.0’’ • Si les données sont stockées dans un fichier trié, faire la recherche binaire pour trouver le premier de ces étudiants, et de là faire un scannage pour trouver les autres. • Le coût de la recherche binaire peut être prohibitif ! Il est en effet proportionnel au # de pages puisées. • Solution: Créer un fichier d’indexes Fichier d’indexes kN k2 k1 Page N Fichier de données Page 3 Page 1 Page 2 • Une recherche binaire est faisable sur de petits fichiers d’indexes!
Page de débordement Entrée d’index ISAM P K P K P P K m 0 1 2 1 m 2 • Le fichier d’indexes peut être très large. On peut cependant appliquer l’idée de fichier d’indexes de manière répétée! Pages internes Pages feuilles Pages primaires • Les pages feuilles contiennent les entrées des données.
ISAM (Suite) Pages de données Pages des indexes • Création du fichier: les feuilles (pages de données) sont allouées séquentiellement et triées selon la clé de recherche; ensuite les pages de débordement sont crées. • Entrées d’indexes: <valeur de la clé, page id>; orientent la recherche vers les entrées de données se trouvant dans les pages feuilles. • Recherche: Commence à la racine; compare des clés pour aller vers la feuille appropriée. Coût: log F N ; F = # entrées/pg index, N = # feuilles • Insertion: Trouver la feuille à la quelle appartient l’entrée de donnée et l’y mettre. • Effacement: Trouver et enlever l’entrée de la feuille; désaffecter une page de débordement vide. Pages de débordement • Structure statique: les changements n’affectent que les feuilles.
Racine 40 20 33 51 63 46* 55* 10* 15* 20* 27* 33* 37* 40* 51* 97* 63* Exemple d’un Arbre ISAM • Chaque nœud peut contenir 2 entrées; il n’y a pas besoin de pointeurs liant les pages entre elles (Pourquoi ???)
Après l’Insertion de 23*, 48*, 41*, 42* ... Racine 40 Pages de l’index 20 33 51 63 Feuilles primaires 46* 55* 10* 15* 20* 27* 33* 37* 40* 51* 97* 63* 41* 48* 23* Pages de débordement 42*
... Ensuite Effacement de 42*, 51*, 97* Racine 40 20 33 51 63 46* 55* 10* 15* 20* 27* 33* 37* 40* 63* 41* 48* 23* • Notez que 51* apparaît au niveau de la page de l’index, mais pas dans la feuille!
Entrées de l’index (orientent la recherche) Entrées de données ("Sequence set") Arbre B+: L’Index le plus Usuel • Insertion/effacement avec coût log F N; Garde la hauteur balancée. (F = ‘’fanout’’, N = # feuilles) • Taux d’occupation minimum de 50%(sauf pour la racine). Chaque nœud contient d <= m <= 2d entrées. Le paramètre d est appelé l’ordre de l’arbre. • Supporte efficacement les recherches des plages de valeurs et les recherches d’égalités.
Exemple d’Arbre B+ • La recherche commence à la racine et les comparaisons des clés l’orientent vers une page (similaire à la méthode ISAM). • Recherchez 5*, 15*, …, toutes les entrées de données >= 24*, ... Racine 30 13 17 24 39* 3* 5* 19* 20* 22* 24* 27* 38* 2* 7* 14* 16* 29* 33* 34*
Arbre B+ en Pratique • Ordre typique: 100. Remplissage typique: 67%. • Sortance (‘’fanout’’) moyenne = 133 • Capacités typiques: • Hauteur 4: 1334 = 312,900,700 enreg.’s • Hauteur 3: 1333 = 2,352,637 enreg.’s • Les niveaux supérieurs de l’arbre peuvent souvent tenir en mémoire principale (‘’buffer pool’’): • Niveau 1 = 1 page = 8 Kbytes • Niveau 2 = 133 pages = 1 Mbyte • Niveau 3 = 17,689 pages = 133 MBytes
Insertion d’une Entrée de Données • Trouver la feuille appropriée L. • Mettre l’entrée de données dans L. • Si L a assez d’espace, fin! • Sinon, on doit partagerL (en L et un nouveau nœud L2) • Redistribuer les entrées de manière égale, copier la clé du milieu vers le haut. • Insérer l’entrée d’index pointant vers L2 dans le parent de L. • Ceci peut arriver de manière récursive • Pour partager nœud d’index, redistribuer les entrées de manière égale, mais pousser la clé du milieu vers le haut. (Contrastez ceci avec le partage des feuilles !!) • Les partages font croître l’arbre; le partage de la racine augmente sa hauteur. • Croissance de l’arbre: devient plus large ou d’ un niveau plus élevé à la racine.
Entrée à insérer dans le nœud parent. (17 est poussé vers le haut et 17 5 13 24 30 Insertion de 8* dans l’Exemple Entrée à insérer dans le nœud parent. • Veuillez noter la différence entre copier vers le hautet pousser vers le haut. (Pourquoi fait-on cette différence????) (Notez que 5 est copié vers le haut et 5 continue d’apparaître dans la feuille.) 3* 5* 2* 7* 8* n’apparaît qu’une fois dans l’index.
Exemple d’Arbre B+ Après l’Insertion de 8* Racine 17 24 5 13 30 39* 2* 3* 5* 7* 8* 19* 20* 22* 24* 27* 38* 29* 33* 34* 14* 16* • La racine a été partagée; d’où augmentation de la hauteur. • En fait, nous pouvons redistribuer ici au lieu de partager; cependant cela n’est pas usuel dans la pratique.
Effacement d’une Entrée de Données • Commencer à la racine, trouver la feuille L à laquelle l’entrée appartient. • Enlever l’entrée. • Si L est au moins à moitié vide, fin! • Sinon L a seulement d-1 entrées, • Essayer de redistribuer, empruntant des cousins. • Sinon, fusionnerL et un cousin. • Si une fusion a lieu, on doit effacer l’entrée (d’indexe) pointant (vers L ou le cousin) à partir du parent de L. • La fusion peut se répercuter jusqu’à la racine, décroissant ainsi la hauteur de l’arbre.
Notre Arbre Après l’Insertion de 8*, Suivie de l’Effacement de 19* et 20* ... • Effacer 19* est facile. • Effacer 20* est fait via une redistribution. Noter comment la clé du milieu est copiée vers le haut après la redistribution. Racine 17 27 5 13 30 39* 2* 3* 5* 7* 8* 22* 24* 27* 29* 38* 33* 34* 14* 16*
... Et Ensuite Après l’Effacement de 24* • On doit fusionner. • A droite, on fait un `changement’ d’entrée d’index. • Ci bas, on `tire une entrée d’index vers le bas’. 30 39* 22* 27* 38* 29* 33* 34* Racine 5 13 17 30 3* 39* 2* 5* 7* 8* 22* 38* 27* 33* 34* 14* 16* 29*
2* 3* 5* 7* 8* 39* 17* 18* 38* 20* 21* 22* 27* 29* 33* 34* 14* 16* Exemple de Redistribution Interne • A l’opposé du cas précédant, ici on peut redistribuer une entrée de l’enfant gauche de la racine vers l’enfant droit. Racine 22 30 17 20 5 13
Après la Redistribution • Intuitivement, les entrées sont redistribuées en `poussant l’entrée partageante vers ’ le noeud parent. • Il suffit de redistribuer l’entrée d’index avec clé 20; on a aussi redistribué 17 pour illustration. Root 17 22 30 5 13 20 2* 3* 5* 7* 8* 39* 17* 18* 38* 20* 21* 22* 27* 29* 33* 34* 14* 16*
3* 6* 9* 10* 11* 12* 13* 23* 31* 36* 38* 41* 44* 4* 20* 22* 35* Chargement en Vrac d’un Arbre B+ • Si l’on a une large collection d’enreg.’s et que l’on veut créer un indexe à arbre B+ avec une clé donnée, le faire enregistrement par enregistrement est très inefficace. • Solution: ‘’Bulk Loading’’ (chargement en vrac). • Initialisation: • Trier toutes les entrées de données et les diviser en page; • créer une page racine vide; et • insérer un pointeur de la racine vers la 1ère page des données. Pages d’entrées de données triées; non encore mises dans l’arbre B+ Racine
Chargement en Vrac (Suite) Racine 10 20 • Les entrées d’index pour les feuilles sont toujours créées dans la page d’index la plus à droite située juste au dessus du niveau des feuilles. Si cette dernière est pleine, elle est partagée. (Ce processus peut se répéter récursivement Pages de données 6 12 23 35 à mettre sur l’arbre 3* 6* 9* 10* 11* 12* 13* 23* 31* 36* 38* 41* 44* 4* 20* 22* 35* Racine 20 10 35 6 23 12 38 3* 6* 9* 10* 11* 12* 13* 23* 31* 36* 38* 41* 44* 4* 20* 22* 35*
Résumé • Index en arbre: ISAM, arbres B+ • ISAM est une structure statique • Seules les feuilles sont modifiées; pages de débordement nécessaires • Défaut: chaînes de débordements • Arbres B+ est une structure dynamique. • Insertion et effacement laissent l’arbre balancé • coût de log F N • Pas de chaînes de débordement • Chargement en vrac des arbres B+