Académique Documents
Professionnel Documents
Culture Documents
d’indexation
• Le résultat de la requête :
l’aiguille !
• Agrégation
SELECT Max(note) FROM
Etudiant ORDER BY note;
SELECT * FROM Etudiant NATURAL JOINT Cours;
ou plus généralement
Approche naïve :
Parcourir les deux tables avec une double boucle
Coût : |T1|x|T2|
Les index pour optimiser
les réponses aux requêtes!
• Un index sur un fichier :
Revenu // Revenu
10 10 10
90 30 20
170 50
250 70 30
40
90
330 50
110
410 60
130
490
150
570 70
170 80
190 90
• 2 niveau sont 210
généralement 230
100
Pas
Pas forcément
forcément contigûité
suffisants des
contigûité
des deux
deux fichiers
fichiers ...
...
• + de 3 rares
Opération de m.a.j
• Insertion
• Suppression
• Quid de ces opérations par rapport aux
types d’index ?
Suppression dans index creux
10
10 20
30
50 30
70 40
90 50
110 60
130
150
70
80
Suppression dans index creux
–supprimer l’enregistrement 40
10
10 20
30
50 30
70 40
90 50
Si l’entrée
110 60
supprimée
130
n’apparait pas dans
150
70
l’index, ne rien 80
faire.
Suppression dans index creux
–supprimer l’enregistrement 30
10
10 20
40 30
50 30 40
70 40
90 50
Si l’entrée
110 60
supprimée apparaît
130
dans l’index alors
150
70
remplacer avec la 80
clé de recherche
suivante
Suppression dans index creux (tjs +)
– supprimer 30 et 40
10
10 20
50 30
70 50 30
70 40
90 50
110 60
Si la clé suivante a sa
130
propre entrée dans
150
70
l’index alors 80
supprimer l’entrée
Suppression dans index dense
10
10 20
20
30 30
40 40
50 50
60 60
70
80
70
80
Suppression dans index dense
– supprimer l’enregistrement 30
10
10 20
20
40 30 30 40
40 40
50 50
La suppression dans 60 60
un index primaire 70
dense se fait de la 80 70
même façon que 80
dans un fichier seq.
Insertion dans index creux
10
10 20
30
40 30
60
40
50
60
Insertion dans index creux
- insérer l’enregistrement 34
10
10 20
30
40 30
60 34
40
50
• On a de la chance ... mais ce 60
n’est pas toujours le cas
Insertion dans index creux
– insérer 15
10
10 20 15
20 30
40 30 20
60 30
40
50
Il faut tout réorganiser 60
des variantes :
insérer un nouveau bloc
m.a.j index
Insertion ++
Index (séquentiel)
10
20 39
30 31
33 35
continu 36
40
50
60 32
espace libre
38
34
70
80
90 overflow area
(pas séquentielle)
Index basiques
Avantages :
Algorithmes très simples
L’index est un fichier séquentiel
facile pour effectuer des passes dessus
Inconvénients :
Insertions coûteuses, et/ou
la notion de séquence est perdue à cause des overflows
(blocs de dépassement)
des réorganisations sont nécessaires
Index basé sur les
B(+)-Arbres
Rappel ABR :
• Niveau recherche :
• Généralisation des
arbres binaires de
recherche.
B-Arbres
• Chaque noeud correspond à un bloc
• Les B-arbres sont équilibrés (toutes les feuilles à la même
profondeur).
• Garantie d’accès efficaces
• B-arbres garantissent une occupation minimale
• n : nombre maximum de clés dans le noeud, le nombre
minimum étant n/2.
• Exception : la racine peut contenir une unique clé
• m+1 pointeurs associés (m est le nombre de clés contenues)
B-arbre +
Non-feuilles
Pages
Feuilles
Pages
X<K1 P0 K 1 P 1 K 2 P 2 K m P m
B-Arbres
30
30
35
100
101
110
100
Root
120
130
150
156 120
179 150
180
Exemple (1)
n=3
180
200
Exemple (2)
Noeud
non-feuille
57
81
95
to keys to keys to keys to keys
< 57 57≤ k<81 81≤k<95 ≥95
Leaf node
To record
with key 57
57
To record
81
with key 81
95
To record
with key 85
Exemple(3)
From non-leaf node
to next leaf
in sequence
B-Arbre : espace mémoire
n=3 Noeud saturé Noeud min.
Non- 120
150
180
30
feuilles
35
30
3
5
Utilisation mémoire
Nombre de pointeurs/clés pour un B-arbre
17
2* 3* 5* 7* 8* 14* 16* 22* 24* 27* 29* 33* 34* 38* 39*
42
Insertion d’un enregistrement
100
n=3 30
11
31
30
32
3
5
Plus de place (1)
Séparer la feuille cible en
deux noeud de (presque) Insérer enr. 7
même taille et copier la clé
(séparatrice) sur le noeud n=3
100
père
30
7
57
31
11
30
3
5
3
Plus de place (1I)
Insérer enr. 160 Séparation en deux de
la feuille pleine et
répercussion vers le
160
100
haut.
120
180
150
180
180
200
150
156
179
179
160
Plus de place (III) : nvlle
racine
Insérer enr. 45 La création d’une
nvlle feuille se
répercute jusqu’à
new root
30
la création d’une
nvlle racine.
40
10
20
30
10
12
20
32
40
25
30
40
45
1
2
3
Ex: Construction de
l’arbre
• N=3 (chaque bloc contient 3 valeurs et 4 pointeurs)
Root
noeuds/blocs triés et pas encore dans le B arbre
3* 4* 6* 9* 10* 11* 12* 13* 20* 22* 23* 31* 35* 36* 38* 41* 44*
Bulk Loading Root 10 20
successives !!! 6 12 23 38
3* 4* 6* 9* 10* 11* 12* 13* 20* 22* 23* 31* 35* 36* 38* 41* 44*
Suppression
• Localiser le noeud correspondant
100
10
40
40
10
20
30
40
50
Suppression (II)
Redistribution des
supp. enr. 50
clés si le noeud est
sous alimenté et que
n=4
la fratrie est sur-
alimenté
40 35
100
10
35
10
20
30
35
50
40
Suppression (III)
Suppression racine
supp. enr. 37
25
Nvlle racine n=4
40
25
20
30
40
10
30
37
30
10
14
22
25
40
45
20
26
1
3
En pratique
• Ordre: 200, espace utilisé : 67%. I.e., average
fanout = 133.
• Capacités :
• Profondeur 4: 1334 = 312,900,700 enregistrements,
• Profondeur 3: 1333 = 2,352,637 enregistrements.
• On peut souvent charger les niveaux supérieurs
en mémoire
• Level 1 = 1 blocs = 8 Ko,
• Level 2 = 133 blocs = 1 Mo,
• Level 3 = 17,689 blocs = 133 Mo.
Tables de hachage
• Des structures d’index basées sur des arbres
permettent de retrouver des enregistrements en
fonction de leur clé de recherche via une structure
arborescente (B-Tree).
• Les tables de hachage assurent aussi ce mapping
Clé/Enregistrement via une fonction de hachage.
• Les tables “hash” sont une deuxième forme d’index
qui est aussi fréquemment utilisée, mais plutôt pour
des relations temporaires conservées en mémoire.
Tables de hachage
record
(2) key → h(key) key 1
Index
Insertions
• Insertion d’un enregistrement possédant une
clé de recherche K.
• Calcul de la fonction de hachage h(K) = i.
• Insertion de l’enregistrement dans le premier
bloc du bac i qui possède suffisamment
d’espace libre.
• S’il n’y a pas de bloc avec suffisamment
d’espace libre alors ajouter un nouveau bloc à
la chaine de dépassement (overflow chain) et y
stocker l’enregistrement.
Insertions
INSERER: 0
d
1
h(a) = 1
a e
h(b) = 2 c
2
h(c) = 1 b
h(d) = 0 3
Taille des bacs
h(e) = 1 2 enregistrements
Suppressions
0
Supprimer : a
1
e
b d
f c d
c 2
e
3 f faire remonter “g”
si possible
g
Complexité des requêtes
Recherche enregistrement(s) de clé K.
•Calcul de h(K) = i. (Attention à la complexité
du calcul de h).
•Localisation de(s) enregistrement(s) de clé K
dans le bac i, et dans la chaine de dépassement.
•En l’absence de dépassement, seulement un
bloc I/O nécessaire , i.e. complexité de O(1) :
c’est à dire borné indépendamment du nombre
d’enregistrements.
Hash table vs B-Tree(+)
• Accès à un enregistrement particulier
généralement plus efficace que les B-
Trees.
• Par contre, les tables de hachage ne
sont pas efficaces pour les requêtes
reposant sur des données triées (<,>,
etc.). Au contraire des B-Trees +
Utilisation d’espace
h(K)
vers les bacs
00110101
i, croît au cours
du temps
Extensible Hash Tables
• Insertion de l’enregistrement de clé K.
• Calcul de h(K) et prendre les i premiers bits.
Niveau global i fait partie de la structure de
données.
• Retrouver l’entrée correspondante dans le
répertoire.
• Suivre le pointeur menant au bloc b. b au niveau
local j <= i.
• Si b possède suffisamment de place, y insérer
l’enregistrement.
• Sinon, diviser b en 2 blocs.
Extensible Hash Tables
• Si j < i, distribuer les enregistrements dans b
en se basant sur le (j+1)ème bit de h(K): si 0,
ancien bloc b, si 1 nouveau bloc b’.
• Incrémenter le niveau local de b et b’.
• Ajuster le pointeur dans le répertoire qui
pointait sur b, il doit maintenant pointer sur b’.
• Si j = i, incrémenter i. Doubler la taille du
répertoire et dupliquer toutes les entrées. Puis
faire comme dans le cas où j < i.
Exemple
i =2
1
i= 1 0001 00
01
10
1 2
1001 11
1010 1100
1 2 Nouveau rep.
Insérer 1010 1100
2
0000
i= 2 0001
00
01 1 2
0001 0111
10
0111
11 2
1001
1010
Insérer :
2
0111 1100
0000
i=3
0000 2
000
i= 2 0001
001
00 0111 2
010
01
10 011
1001 3
11 1001 100
101
1010 1001 2 3
1010 110
Insérer :
111
1001 1100 2
Overflow
• On peut encore avoir besoin de chaines de
dépassement en présence d’un nombre trop
important de duplication.
Si nous divisons :
insérer 1100
1 2
1101
1100
• La division n’aide pas
2
si toutes les entrées se retrouvent
1100
dans un seul des deux blocs! 1100
Overflow
1 1
1101 1101 1100
1100 1101
Suppression
Suppriment enregistrement de clé K.
•En utilisant le répertoire, localiser le bloc b
correspondant et y supprimer l’enregistrement.
•Si possible, fusionner le bloc b avec le bloc
«ami» b’ and ajuster les pointeurs de b et b’
dans le répertoire.
•Si possible, réduire de moitié le répertoire.
inverse de la procédure d’insertion.
Discussion
• Gestion du nombre croissant de bacs sans
gaspiller trop d’espace.
• Cela suppose que le répertoire tient en
mémoire.
• Jamais d’accès à plus d’un bloc de données
(si pas d’overflow) pour une requête.
• Doubler le répertoire est une opération très
coûteuse qui interrompt les autres opérations
et peut nécessité un stockage sur disque.
Linear Hash Tables
• Pas de répertoire.
• La fonction de hachage calcule des séquences
de k bits. Prend seulement les i derniers et
les interprète comme le bac de numéro m.
00110101
• croissance linéaire
Insertion
• Le bac ajouté n’est pas généralement dans le
rayon des clés où un overflow est apparu.
• Quand n > 2i, incrementer i de 1.
• i est le nombre de tours is the number of
rounds doublant la taille de la table.
• Pas besoin de déplacer des entrées.
Exemple
k = 4, i = 2
0101 • insérer 0101
• peut y avoir des chaines
d’overflow!
Futurs
0101 bacs
1010 1111
00 01 10 11
n = 01 Si h(k)[i ] ≤ n, alors
regarder bac h(k)[i ]
sinon, regarder bac h(k)[i ] – 2i -1
Exemple
k = 4, i = 2
Futurs
0101 1010 1111 bacs
0101
1010 1111
00 01 10 11
n = 01
10
11
Exemple
k=4
i=2 3
...
Requête :
Qui est dans un rayon de 5 km
autour de <Xi,Yi>?
Quel est le point le proche de
<Xi,Yi>?
Index MD
• Multi-key Index
• Grid Files
• Partitioned Hash Indexes
• R Trees
• etc.
Multi-Key Index : Strategie I
I1
Multi-Key Index : Strategie II
• Multiple Key
Index I2
I1 I3
• Example
• Record
10k
15k
Art 17k
Sales 21k
Toy
• Dept
12k Name=Joe
• Index 15k DEPT=Sales
15k SAL=15k
19k
• Salaire
• Index
Grid-File Index
• Key 2
• X1 X2 …… Xn
• V1
• V2
• Key 1
• Vn
• key 1 = V i
• key 2 = X j
X1
X2
X4
X3
X4
X3
X1
X2
Solutions
• La grille ne contient que des pointeurs sur
des buckets.
X1 X2 X3 --
V1 --
--
V2 --
V3 --
V4 --
--
-- --
-- --
-- --
Partitionner les
domaines
Grid
0-20K 1
20K-50K 2
50K- 3
8
Salaire
1 2 3
Linear Scale Toy Sales Personnel
Grid files