Title: Indexes
1Indexes à Arbres et Indexes à Hachage
- Sections sélectionnées des Chapitres 10 11
2Introduction
- Rappel des 3 alternatives dentrées des données
k - un enregistrement de données avec une valeur de
clé k - une paire ltk, ridgt
- une paire ltk, liste de ridsgt
- Le choix dépend de la technique dindex utiliée
pour localiser les entres des donnees k. - Les indexes à arbres supportent à la fois la
recherche des plages de valeurs (range
search) ainsi que les recherches degalités
(equality search). - ISAM srtucture statique B tree dynamique,
sajuste gracieusement aux insertions et
effacements. - Indexes à Hachage meilleurs pour les recherches
dégalité ne peuvent supporter les recherches
des valeurs des plages.
3Intuition Derrière les Indexes à Arbres
- Trouvez tous les étudiants avec un gpa gt 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 dindexes
Fichier dindexes
kN
k2
k1
Page N
Fichier de données
Page 1
Page 3
Page 2
- Une recherche binaire est faisable sur de petits
fichiers dindexes!
4ISAM
Entrée dindex
P
K
P
K
P
P
K
m
0
1
2
1
m
2
- Le fichier dindexes peut être très large. On
peut cependant appliquer lidée de fichier
dindexes de manière répétée!
Pages
internes
Pages
feuilles
Pages primaires
- Les pages feuilles contiennent les entrées des
données.
5ISAM (Suite)
- 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 dindexes ltvaleur de la clé, page idgt
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 lentrée de donnée et ly mettre. - Effacement Trouver et enlever lentrée de la
feuille désaffecter une page de débordement vide.
Pages de données
Pages des indexes
Pages de débordement
- Structure statique les changements naffectent
que les feuilles.
6Exemple dun Arbre ISAM
- Chaque nœud peut contenir 2 entrées il ny a pas
besoin de pointeurs liant les pages entre elles
(Pourquoi ???)
7Après lInsertion de 23, 48, 41, 42 ...
Racine
40
Pages de lindex
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
8 ... 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
lindex, - mais pas dans la feuille!
9Arbre B LIndex le plus Usuel
- Insertion/effacement avec coût log F N Garde la
hauteur balancée. (F fanout, N
feuilles) - Taux doccupation minimum de 50(sauf pour la
racine). Chaque nœud contient d lt m lt 2d
entrées. Le paramètre d est appelé lordre de
larbre. - Supporte efficacement les recherches des plages
de valeurs et les recherches dégalités.
10Exemple dArbre B
- La recherche commence à la racine et les
comparaisons des clés lorientent vers une page
(similaire à la méthode ISAM). - Recherchez 5, 15, , toutes entrées de données
gt 24 ...
Racine
17
24
30
13
39
3
5
19
20
22
24
27
38
2
7
14
16
29
33
34
11Arbre 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 larbre 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
12Insertion dune Entrée de Données
- Trouver la feuille appropriée L.
- Mettre lentrée de données dans L.
- Si L a assez despace, fin!
- Sinon, on doit partager L (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 lentrée dindex pointant vers L2 dans le
parent de L. - Ceci peut arriver de manière récursive
- Pour partager nœud dindex, 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 larbre le partage de
la racine augmente sa hauteur. - Croissance de larbre devient plus large ou d
un niveau plus élevé à la racine.
13Insertion de 8 dans lExemple
- Veuillez noter la différence entre copier vers le
haut et pousser vers le haut. (Pourquoi fait-on
cette différence????)
Entrée à insérer dans le nœud parent.
(Notez que 5 est copié vers le haut et
5
continue dapparaître dans la feuille.)
3
5
2
7
8
napparaît quune fois dans lindex.
14Exemple dArbre B Après lInsertion de 8
Racine
17
24
30
13
5
2
3
39
19
20
22
24
27
38
7
5
8
14
16
29
33
34
- La racine a été partagée doù augmentation de
la hauteur.
- En fait, nous pouvons redistribuer ici au lieu
de partager - cependant cela nest pas usuel dans la
pratique.
15Effacement dune Entrée de Donnée
- Commencer à la racine, trouver la feuille L Ã
laquelle lentrée appartient. - Enlever lentrée.
- Si L est au moins à moitié vide, fin!
- Sinon L a seulement d-1 entrées,
- Essayer de redistribuer, empruntant des cousins .
- Sinon, fusionner L et un cousin.
- Si une fusion a lieu, on doit effacer lentrée
(dindexe) 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 larbre.
16Notre Arbre Après lInsertion de 8, Suivie de
lEffacement de 19 et 20 ...
Racine
17
27
30
13
5
2
3
39
38
7
5
8
22
24
27
29
14
16
33
34
- 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.
17 ... Et Ensuite Après lEffacement de 24
- On doit fusionner.
- A droite, on fait un échange dentrée dindex.
- Ci bas, on tire une entrée vers le bas.
30
39
22
27
38
29
33
34
Racine
13
5
30
17
3
39
2
7
22
38
5
8
27
33
34
14
16
29
18Exemple de Redistribution Interne
- A lopposé du cas précédant, ici on peut
redistribuer une entrée de lenfant gauche de la
racine vers lenfant droit.
Racine
22
30
17
20
13
5
19Après la Redistribution
- Intuitivement, les entrées sont redistribuées en
poussant lentrée partageante vers le noeud
parent. - Il suffit de redistribuer lentrée dindex avec
clé 20 on a aussi redistribué 17 pour
illustration.
Root
17
13
5
30
22
20
39
7
5
8
2
3
38
17
18
33
34
22
27
29
20
21
14
16
20Chargement en Vrac dun Arbre B
- Si lon a une large collection denreg.s et que
lon 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 dentrées de données triées non encore
mises dans larbre B
Racine
21Chargement en Vrac (Suite)
- Les entrées dindex pour les feuilles sont
toujours créées dans la page dindex 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
Racine
10
20
Pages de données
35
23
12
6
à mettre sur larbre
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
22Hachage Statique
- Pages primaires en nombre fixe et affectées
séquentiellement jamais désaffectées pages de
débordement si nécessaire. - h(k) mod M bucket où mettre lentrée des
données dont la clé est k. (M de buckets)
0
h(key) mod N
2
key
h
N-1
Pages (bucket) primaires
Pages de débordement
23Hachage Statique (Suite)
- Les buckets contiennent les entrées des données.
- La fonction de hachage utilise le champ de la clé
de recherche de lenregistrement r. Les valeurs
des clés doivent être distribuées sur une plage
allant de 0 à M-1. - Les fonctions de hachage ont été abondamment
étudiées. - Défaut possible développement de longues chaînes
de débordement qui peuvent entraver la
performance. - Hachage extensible et haching linéaire
Techniques dynamiques pour résoudre ce problème.
24Hachage Extensible
- Situation un bucket (page primaire) se remplit.
Pourrait-on réorganiser le fichier en doublant le
de buckets? - Lire et écrire toutes les pages est très coûteux!
- Solution Utiliser un répertoire de pointeurs
vers les buckets doubler le de buckets en
doublant la taille du répertoire, tout en ne
partageant que les buckets en débordement! - Le répertoire est bien plus petit que le fichier
lui-même, doù doubler le répertoire est moins
coûteux. Plus besoin de pages de débordement!
25Exemple
2
PROFONDEUR LOCALE
Bucket A
16
4
12
32
PROFONDEUR GLOBALE
- Le répertoire est de taille 4.
- Pour trouver un bucket pour r, prendre un de
bits à la fin de h(r) équivalent à la
profondeur globale p.ex. - Si h(r) 5 ( binaire 101), r est dans le bucket
vers le quel pointe 01.
2
2
Bucket B
13
00
1
21
5
01
2
10
Bucket C
10
11
2
REPERTOIRE
Bucket D
15
7
19
PAGES DE DONNEES
- Insertion Si le bucket est plein, le partager
(affecter une nlle page, - et redistribuer).
- Si nécessaire, doubler le répertoire. (En fait,
partager un bucket - nentraîne pas nécessairement le doublement
du répertoire - un doublement nest nécessaire que si la
profondeur globale ne - correspond plus a la profondeur locale.)
26Insertion de h(r)20 (Cause un Doublement)
2
3
PROFONDEUR LOCALE
PROFONDEUR LOCALE
Bucket A
16
32
32
16
Bucket A
PROFONDEUR GLOBALE
PROFONDEUR GLOBALE
2
2
2
3
Bucket B
1
5
21
13
00
1
5
21
13
000
Bucket B
01
001
2
10
2
010
Bucket C
10
11
10
Bucket C
011
100
2
2
REPERTOIRE
101
Bucket D
15
7
19
15
19
7
Bucket D
110
111
2
3
Bucket A2
20
4
12
DIRECTORY
20
12
Bucket A2
4
(image'
de Bucket A)
(image'
de Bucket A)
27Insertion de h(r)20 (Suite)
- 20 binaire 10100. Derniers 2 bits (00)
indiquent que r appartient au bucket A qui est
déjà plein! On divise A en A et A2. mais on a
besoin des 3 derniers bits pour décider. - Profondeur Globale du répertoire Max de bits
nécessaires pour décider du bucket auquel une
entrée appartient. - Profondeur Locale dun bucket de bits utilisés
pour déterminer si une entrée appartient à ce
bucket. - Quand double-t-on le répertoire?
- Avant insertion p.l. du bucket p.g..
Linsertion entraîne p.l. gt p.g. le répertoire
est doublé par copie (copying over) et
réarrangement des pointeurs.
28Ré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 larbre balancé
- coût de log F N
- Pas de chaînes de débordement
- Bulk loading des arbres B
- Index à hachage Hachage statique vs. extensible