Vous êtes sur la page 1sur 37

Chapitre 02 : L’indexation

Plan


Concepts de base

Index ordonnés

Fichiers d'indexation B+-Tree

Fichiers d'indexation B-Tree

Hachage

Index optimisés pour l'écriture

Indexation spatio-temporelle

2
Concepts de base


Mécanismes d'indexation utilisés pour accélérer l'accès aux données souhaitées.
– Par exemple, catalogue d'auteur dans la bibliothèque

Clé de recherche - attribut (ou ensemble d'attributs) utilisé pour rechercher des
enregistrements (tuples) dans un fichier.

Un fichier d'index est constitué d'enregistrements (appelés entrées d'index) de la
forme
Clé de recherche pointeur


Les fichiers d'index sont généralement beaucoup plus petits que le fichier
d'origine

Deux types fondamentaux d'indices :
– Index ordonnés : les clés de recherche sont stockées dans un ordre trié
– Index de hachage : les clés de recherche sont réparties uniformément dans
les « compartiments » à l'aide d'une « fonction de hachage ».
3
Métriques d’évaluation des index


Types d’accès pris en charge efficacement. Par exemple.,
– Enregistrements avec une valeur spécifiée dans l'attribut
– Enregistrements dont la valeur d'attribut se situe dans une plage de
valeurs spécifiée.


Temps d'accès

Temps d'insertion

Temps de suppression

Espace

4
Index ordonnés


Dans un index ordonné, les entrées d'index sont stockées triées sur la valeur
de la clé de recherche.

Index de clustering : dans un fichier ordonné séquentiellement, l'index dont
la clé de recherche spécifie l'ordre séquentiel du fichier.
– Aussi appelé index primaire
– La clé de recherche d'un index primaire est généralement mais pas
nécessairement la clé primaire.

Index secondaire : un index dont la clé de recherche spécifie un ordre
différent de l'ordre séquentiel du fichier. Aussi appelé index non clusterisé.

Fichier index-séquentiel : fichier séquentiel ordonné sur une clé de
recherche, avec un index de clustering sur la clé de recherche.

5
Index denses


Index dense : un enregistrement d'index apparaît pour chaque valeur de la
clé de recherche dans le fichier.
– Par exemple. index sur l'attribut ID de la relation instructeur

6
Index denses


Index dense sur dept_name, avec fichier instructeur trié sur dept_name

7
Index non denses (Éparse)


contient des enregistrements d'index pour certaines valeurs de la clé de
recherche uniquement.
– Applicable lorsque les enregistrements sont classés séquentiellement sur
la clé de recherche

Pour localiser un enregistrement avec la valeur de clé de recherche K, nous :
– Rechercher l'enregistrement d'index avec la plus grande valeur de clé de
recherche < K
– Rechercher le fichier de manière séquentielle en commençant par
l'enregistrement vers lequel pointe l'enregistrement d'index

8
Index non denses

Par rapport aux index denses :


– Moins d’espace et moins de coûts de maintenance pour insertions et suppressions.
– Généralement plus lent qu'un index dense pour localiser les enregistrements.

Bon compromis :

– pour un index clusterisé : index éparse avec une entrée d'index pour chaque bloc du
fichier, correspondant à la plus petite valeur de clé de recherche dans le bloc.
– Pour un index non clusterisé : index éparse au-dessus d'un index dense (index
multiniveau)
9
Exemple d'index secondaires


Index secondaire sur l’attribut salaire de l'instructeur


L'enregistrement d'index pointe vers un compartiment qui contient des
pointeurs vers tous les enregistrements réels avec cette valeur de clé de
recherche particulière.

Les index secondaires doivent être denses
10
Index primaires et secondaires


Offrent des avantages substantiels lors de la recherche d'enregistrements.

MAIS : les index imposent une surcharge sur la modification de la base de
données
– lorsqu'un enregistrement est inséré ou supprimé, chaque index sur la
relation doit être mis à jour
– Lorsqu'un enregistrement est mis à jour, tout index sur l’attribut mis à jour
doit être mis à jour.

L'analyse séquentielle en utilisant un index primaire est efficace, mais une
analyse séquentielle utilisant un index secondaire est coûteuse sur un disque
magnétique.
– Chaque accès à l'enregistrement peut récupérer un nouveau bloc du disque
– Chaque bloc récupéré sur un disque magnétique nécessite environ 5 à 10
millisecondes

11
Index multi-niveaux


Si l'index ne rentre pas dans la mémoire, l'accès devient coûteux.

Solution : traitez l'index conservé sur le disque comme un fichier séquentiel
et lui rajouter un index non dense.
– index externe – un index non dense de l'index de base
– index interne – le fichier d'index de base

Si encore l'index externe est trop grand pour rentrer dans la mémoire
principale, un autre niveau d'index peut être créé, et ainsi de suite.

Les index à tous les niveaux doivent être mis à jour lors d’une insertion ou
d’une suppression du fichier.

12
Index multi-niveaux

13
Mise à jour de l'index : suppression

Si l'enregistrement supprimé était le


seul enregistrement du fichier avec sa
valeur de clé de recherche particulière,
la clé de recherche est également
supprimée de l'index.


Suppression d'une entrée d'index à un seul niveau :
– Index dense – la suppression de la clé de recherche est similaire à la suppression
des enregistrements de fichiers.
– Index non dense–

si une entrée pour la clé de recherche existe dans l'index, elle est
supprimée en remplaçant l'entrée dans l'index par la valeur de clé de
recherche suivante dans le fichier (dans l'ordre des clés de recherche).

Si la valeur de clé de recherche suivante possède déjà une entrée d'index,
l'entrée est supprimée au lieu d'être remplacée.
14
Mise à jour de l'index : Insertion


Insertion d'index à un seul niveau :
– Effectuez une recherche à l'aide de la valeur de la clé de recherche de
l'enregistrement à insérer.
– Index denses – si la valeur de la clé de recherche n'apparaît pas dans
l'index, insérez-la

Les index sont conservés sous forme de fichiers séquentiels
– Index non dense – si l'index stocke une entrée pour chaque bloc du
fichier, aucune modification ne doit être apportée à l'index à moins qu'un
nouveau bloc ne soit créé.

Si un nouveau bloc est créé, la première valeur de clé de recherche
apparaissant dans le nouveau bloc est insérée dans l'index.

15
Fichiers d'indexation Arbre-B+


Inconvénient des fichiers séquentiels indexés
– Les performances se dégradent avec l’évolution de la taille du fichier .
– Une réorganisation périodique de l'ensemble du fichier d’index est
nécessaire.

Avantage des fichiers d'index Arbre-B+ :
– Se réorganise automatiquement avec de petits changements locaux, face
aux insertions et suppressions.
– La réorganisation de l'intégralité du fichier n'est pas nécessaire pour
maintenir les performances.

Inconvénient des arbres B+ :
– Coûts d’insertion et de suppression supplémentaires, coûts d’espace.

Les avantages des arbres B+ l’emportent sur les inconvénients
– Les arbres B+ sont largement utilisés
16
Exemple d'arbre B+

17
Index Arbre-B+


Un arbre B+ est un arbre satisfaisant les propriétés suivantes :
– Tous les chemins de la racine aux feuilles ont la même longueur
– Chaque nœud qui n'est ni une racine ni une feuille a entre n/2 et n fils.
– Un nœud feuille a entre (n–1)/2 et n–1 valeurs
– Cas spéciaux:

Si la racine n’est pas une feuille, elle a au moins 2 fils.

Si la racine est une feuille (c’est-à-dire qu’il n’y a pas d’autres nœuds
dans l’arborescence), elle peut avoir entre 0 et (n-1) valeurs.

18
Structure des nœuds d'arbre B+


Nœud typique

– Ki sont les valeurs de la clé de recherche


– Pi sont des pointeurs vers des fils (pour les nœuds non-feuilles) ou des
pointeurs vers des enregistrements ou des groupes d'enregistrements
(pour les nœuds feuilles).

Les valeurs de la clé de recherche dans un nœud sont ordonnées
– K1 < K2 < K3 < . . . < Kn–1

19
Nœuds feuilles dans les arbres B+


Propriétés d'un nœud feuille :
– Pour i = 1, 2, . . ., n–1, le pointeur Pi pointe vers un enregistrement de
fichier avec la valeur de clé de recherche Ki,
– Si Li, Lj sont des nœuds feuilles et i < j, les valeurs de la clé de recherche
de Li sont inférieures ou égales aux valeurs de la clé de recherche de L j.
– Pn pointe vers le nœud feuille suivant dans l'ordre des valeurs de la clé de
recherche

20
Nœuds non feuilles dans les arbres B+


Les nœuds non feuilles forment un index non dense à plusieurs niveaux
sur les nœuds feuilles. Pour un nœud non-feuille avec m pointeurs :
– Toutes les valeurs de la clé de recherche du sous-arbre vers lequel P1
pointe sont inférieures à K1
– Pour 2 ≤ i ≤ n – 1, toutes les valeurs de la clé de recherche du sous-arbre
vers lequel Pi pointe ont des valeurs supérieures ou égales à K i–1 et
inférieures à Ki
– Toutes les valeurs de la clé de recherche du sous-arbre vers lequel pointe
Pn ont des valeurs supérieures ou égales à Kn–1
– Structure générale

21
Exemple d'arbre B+


Arbre B+ pour fichier instructeur (n = 6)


Les nœuds feuilles doivent avoir entre 3 et 5 valeurs

((n–1)/2 et n –1, avec n = 6).

Les nœuds non feuilles autres que la racine doivent avoir entre 3 et 6
enfants ((n/2 et n avec n =6).

La racine doit avoir au moins 2 fils.

22
Observations sur les arbres B+


Puisque les connexions entre les nœuds se font par des pointeurs, les blocs
« logiquement » proches n’ont pas besoin d’être « physiquement » proches.

Les niveaux non-feuilles de l'arbre B+ forment une hiérarchie d'index non
denses.

L'arbre B+ contient un nombre relativement petit de niveaux
– Le niveau en dessous de la racine a au moins 2* n/2 valeurs
– Le niveau suivant a au moins 2* n/2 * n/2 valeurs
– .. etc.
– S'il y a K valeurs de la clé de recherche dans le fichier, la hauteur de l'arbre
n'est pas supérieure à log[n/2](K)
– les recherches peuvent ainsi être menées efficacement.

Les insertions et suppressions dans le fichier principal peuvent être gérées
efficacement, car l'index peut être restructuré en temps logarithmique.
23
Requêtes sur les arbres B+

function find(v)
1. C=root
2. while (C is not a leaf node)
1. Let i be least number s.t. V  Ki.
2. if there is no such number i then
3. Set C = last non-null pointer in C
4. else if (v = C.Ki ) Set C = Pi +1
5. else set C = C.Pi
3. if for some i, Ki = V then return C.Pi
4. else return null /* no record with search-key value v exists. */

24
Requêtes sur les arbres B+


Les requêtes par plage trouvent tous les enregistrements avec des
valeurs de la clé de recherche dans une plage donnée (lb, ub)
– la fonction findRange(lb, ub) renvoie tous les enregistrements qui ont
des valeurs dans la plage (lb, ub).
– Les implémentations réelles fournissent généralement une interface
d’itérateur pour récupérer les enregistrements correspondants un par un,
à l'aide d'une fonction next()

25
Requêtes sur les arbres B+


S'il y a K valeurs de la clé de recherche dans le fichier, la hauteur de
l'arbre n'est pas supérieure à log[n/2](K).

Un nœud a généralement la même taille qu'un bloc de disque,
généralement 4 kilo-octets
– et n est généralement d'environ 100 (40 octets par entrée d'index).

Avec 1 million de valeurs de la clé de recherche et n = 100
– au plus log50(1 000 000) = 4 nœuds sont accessibles lors d'un parcours de
recherche de la racine aux feuilles.

Comparez cela avec un arbre binaire équilibré avec 1 million de valeurs de
la clé de recherche : environ 20 nœuds sont accessibles lors d'une
recherche.
– la différence ci-dessus est significative puisque chaque accès à un nœud
peut nécessiter une E/S disque, ce qui coûte environ 20 millisecondes

26
Mises à jour sur les arbres
B+ : insertion

Supposons qu'un enregistrement vient d’être ajouté au fichier. Soient
– pr un pointeur vers l'enregistrement
– v la valeur de la clé de recherche de l'enregistrement

Recherchez le nœud feuille dans lequel la valeur de la clé de recherche
apparaîtrait
– S'il y a de la place dans le nœud feuille, insérez la paire (v, pr) dans le
nœud feuille
– Sinon, divisez le nœud (avec la nouvelle entrée (v, pr)) comme indiqué
dans la diapositive suivante et propagez les mises à jour aux nœuds
parents.

27
Mises à jour sur les arbres
B+ : insertion

Fractionner un nœud feuille :
– prenez les n paires (valeur de clé de recherche, pointeur) (y compris celle
insérée) dans l'ordre trié. Placez le premier n/2 dans le nœud d'origine et le
reste dans un nouveau nœud.
– que le nouveau nœud soit p et que k soit la plus petite valeur de p. Insérez (k,p)
dans le parent du nœud en cours de division.
– Si le parent est plein, divisez-le et propagez la division plus haut.

La division des nœuds se poursuit vers le haut jusqu'à ce qu'un nœud qui n'est
pas plein soit trouvé.
– Dans le pire des cas, le nœud racine peut être divisé, augmentant la hauteur de
l'arbre de 1.

– Résultat de la division du nœud contenant Brandt, Califieri et Crick lors de


l'insertion d'Adams. Étape suivante : insérer l'entrée avec (Califieri, pointeur
vers un nouveau nœud) dans le parent.
28
Mises à jour sur les arbres
B+ : insertion

Nœuds affectés

Arbre-B+ avant et après l’insertion de « Adams »


29
Mises à jour sur les arbres
B+ : insertion

Arbre-B+ avant et après l’insertion de « Lamport » Noeuds Affectés

Noeuds affectés 30
Mises à jour sur les arbres
B+ : insertion

Fractionnement d'un nœud non-feuille : lors de l'insertion de (k,p) dans un
nœud interne déjà complet N
– Copiez N dans une zone en mémoire M avec un espace pour n+1
pointeurs et n clés
– Insérer (k,p) dans M
– Copier P1,K1, …, K [n/2]-1,P n/2 de M vers le nœud N
– Copier P[n/2]+1,K [n/2]+1,…,Kn,Pn+1 de M dans le nœud N' nouvellement
alloué
– Insérer (K n/2,N') dans le parent N

Exemple

31
Mises à jour sur les arbres
B+ : suppression

Supposons qu’un enregistrement est supprimé du fichier. Soit V la valeur


de la clé de recherche de l'enregistrement et Pr le pointeur vers
l'enregistrement.

Supprimer (Pr, V) du nœud feuille

Si le nœud a trop peu d'entrées en raison de la suppression et que les
entrées du nœud et d'un voisin tiennent dans un seul nœud, fusionnez les
:
– Insérez toutes les valeurs de la clé de recherche dans les deux nœuds
dans un seul nœud (celui de gauche) et supprimez l'autre nœud.
– Supprimez la paire (Ki–1, Pi), où Pi est le pointeur vers le nœud supprimé,
de son parent, de manière récursive en utilisant la procédure ci-dessus.

32
Mises à jour sur les arbres
B+ : suppression


Sinon, si le nœud a trop peu d'entrées en raison de la suppression, mais
que les entrées du nœud et d'un voisin ne rentrent pas dans un seul
nœud, redistribuez les pointeurs :
– Redistribuez les pointeurs entre le nœud et un voisin de telle sorte que
les deux aient plus que le nombre minimum d'entrées.
– Mettez à jour la valeur de la clé de recherche correspondante dans le
parent du nœud.

Les suppressions de nœuds peuvent se répercuter vers le haut jusqu'à ce
qu'un nœud comportant n/2 ou plus de pointeurs soit trouvé.

Si le nœud racine n'a qu'un seul pointeur après suppression, il est
supprimé et l'unique fils devient la racine.

33
Mises à jour sur les arbres
B+ : suppression

Avant et Après la suppression de “Srinivasan”

Nœuds Affectés

Suppression de “Srinivasan” provoque la fusion des feuilles


34
Mises à jour sur les arbres
B+ : suppression

Avant et après la suppression de “Singh” et “Wu”

Nœuds affectés


La feuille contenant Singh et Wu est devenue incomplète et a emprunté Kim à son voisin
gauche

La valeur de la clé de recherche dans le parent change en conséquence
35
Avant et après la suppression de “Gold”


Nœud contenant Gold et Katz est devenu incomplet et il est fusionné avec son voisin

Le nœud parent devient sous-complet et est fusionné avec son frère

La valeur séparant deux nœuds (chez le parent) est abaissée lors de la fusion

Le nœud racine n'a alors qu'un seul fils et alors est supprimé
36
37

Vous aimerez peut-être aussi