• Aucun résultat trouvé

2 Organisation des fichiers

3.3 Dictionnaire des donn´ ees

La m´etabase est la base qui g`ere toutes les bases. Elle est con¸cue selon un sch´ema relationnel et constitue un dictionnaire des donn´ees prenant en compte :

– les utilisateurs – leurs droits

– les objets (tables, vues, index, etc) – les attributs de chaque table

– la structure logique de description des tables, la taille et l’organisation des blocs de donn´ees. – l’organisation des fichiers, leur taux d’occupation, l’espace libre.

A titre d’exemple, le dictionnaire d’ORACLE ´etait constitu´e de 44 tables pour la version 5, d’une centaine pour la version 6, pr`es de 300 pour la version 7 et plus de 1000 pour la V10. Certaines de ces tables ne peuvent ˆetre acc´ed´ees que par le DBA.

La base du dictionnaire de la V7 est en r´ealit´e d´etenue par le super-administrateur SYS, qui voit les tables suivantes (toutes ne sont pas indiqu´ees) du v´eritable dictionnaire :

USER$ Liste des utilisateurs et des rˆoles OBJ$ Objets des utilisateurs

TS$ Tablespaces FILE$ Fichiers SEG$ Segments TAB$ Tables de la base CLU$ Clusters

IND$ Indexes

ICOL$ Colonnes accessibles par un index CON$ Liste des contraintes

CDEF$ D´efinitions des contraintes

CCOL$ Colonnes sur lesquelles portent des contraintes

Le dictionnaire courant accessible `a l’administrateur SYSTEM ainsi qu’aux utilisateurs ordinaires est compos´e de vues sp´ecialis´ees, permettant d’avoir la liste des objets de la base. Ce sont des vues construite sur le dictionnaire interne, mˆeme quand elles sont qualifi´ees de tables. Certaines sont issues des anciennes versions d’Oracle pour des raisons de compatiblit´e.

4

Les m´ethodes d’acc`es

Aujourd’hui, les SGBD utilisent essentiellement des acc`es directs en utilisant les techniques de hachage et d’indexation.

4.1

Le hachage

4.1.1 Principe

Le principe en est tr`es simple. L’acc`es est calcul´e par une fonction de hachage h, qui, `a une entr´ee i, fait correspondre la valeur h(i) ∈ [1, C]. Une mˆeme valeur h(i) peut correspondre `a plusieurs entr´ees diff´erentes, qui appartiennent alors `a la mˆeme classe d’´equivalence. La fonction h est caract´eris´ee par la valeur C du nombre de classes qu’elle d´etermine.

Entrée 0 Entrée 1 i C Table de hachage Blocs de données

L’acc`es aux donn´ees est r´ealis´e par une table de hachage, qui, `a chaque valeur de h(i), fournit l’adresse de la zone de stockage correspondante. Comme plusieurs entr´ees d´elivrent la mˆeme valeur, on assiste, relativement `a la zone de stockage, `a un m´ecanisme de collision qui peut ˆetre r´esolu de diff´erentes fa¸cons ; les plus courantes sont le chaˆınage, ou l’utilisation d’une fonction de collision pour obtenir une nouvelle adresse. Dans tous les cas, la recherche de l’information devient s´equentielle, chaque collision imposant la lecture ou le calcul de l’adresse suivante.

4.1.2 Exemples

Il n’y a pas de th´eorie pour construire une “bonne” fonction de hachage, chaque programmeur conservant jalousement celle qu’il a r´eussi `a imaginer apr`es un bricolage plus ou moins laborieux.

Le principe du hachage suppose une ´equi-r´epartition des valeurs de l’argument, ce qui est rarement observ´e en pratique. Cet argument est toujours num´erique, et necessite une transformation pr´ealable des cl´es alpha- num´eriques.

Une bonne m´ethode de transformation des cl´es alph-num´eriques en valeurs num´eriques consiste `a extraire des caract`eres m´edians d’une cl´e ( 2 ou 4), et `a prendre les valeurs binaires correspondantes pour former les poids

hauts et bas d’une entier. Une fois la cl´e num´eris´ee, il existe bien des proc´ed´es pour construire des fonctions de hachage :

– Les fonctions les plus simples sont construites `a partir de la fonction modulo : h(cl´e)=cl´e Modulo N, ou N est le nombre maximum de classes voulues.

– La m´ethode du milieu des carr´es consiste `a extraire des bits du milieu du carr´e des cl´es. La valeur obtenue correspond `a une classe d’´equivalence et est convertie en adresse. Exemple : 54862 → 30096196. On peut

extraire la valeur m´ediane : 96.

– la m´ethode de d´ecoupage et addition transforme un nombre sans tenir compte de la derni`ere retenue, conform´ement `a l’exemple suivant : 24315268 → 243 + 152 + 68 = 463

4.1.3 Acc`es multicl´es

Les tables de hachage peuvent ˆetre bi, voire multi-dimensionnelles. Elles permettent en cas de recherche multicrit`eres d’acc´eder `a des zones o`u sont stock´es les enregistrement correspondant `a des entr´ees multiples. La gestion d’une telle structure est cependant tr`es lourde si l’on tient compte des mises `a jour.

On peut aussi r´ealiser un hachage partitionn´e si la fonction de hachage est capable de traiter une entr´ee constitu´ee de champs ind´ependants. Par exemple, si le premier champ renvoit `a un service et le dernier `a un emploi, la valeur 010.110 permet d’acc`eder `a un programmeur particulier d’IEEA. La valeur 000.110 renverra `a l’ensemble des programmeurs.

4.1.4 Tableaux de bits

Une utilisation annexe, mais importante, des fonctions de hachage est li´ee `a l’optimisation des op´erations de jointure. De fa¸con `a ne s´electionner que les tuples qui interviennent dans la jointure de R et S, lorsque la cardinalit´e de R est tr`es grande devant celle de S, on op`ere de la fa¸con suivante :

On applique aux tuples de S une petite s´erie de fonctions simples, h0, h1, . . ., hn, ayant si possible le mˆeme

nombre de classes. Si, pour un tuple side S, h(si)=j, on met `a 1 l’´el´ement (i,j) d’une table T, et `a 0 sinon. Cette

table sert ensuite de crible pour tester les tuples de R. Si un tuple de R a une signature conforme `a la table (∀i, hi(r) = j avec T(i,j)=1), il est retenu, car susceptible de participer `a la jointure.

h0 101101010101110101000101010 h1 010101011110101000101010101 h2 111001100010100011110101011 h3 001100001101011101011100101 Classes 012345 ... j ... N

Tableau de bits ou crible de jointure

4.1.5 Gestion des collisions

C’est le principal probl`eme `a r´esoudre si on veut ´eviter la s´equentialisation qui en d´ecoule. En cas de collision, il faut ranger un tuple dans l’espace associ´e `a une classe. Si cet espace est satur´e, il faut allouer une extension de taille suffisant e pour tenir compte d’autres collisions ´eventuelles.

La m´ethode de Fagin conduit `a une croissance quadratique de l’espace d’allocation. Son principe est le suivant : Lors de l’initialisation d’une table, on utilise une fonction de hachage dont la valeur tient sur un bit. Elle permet d’acc´eder `a seulement 2 paquets d´enomm´es 0 et 1. D`es qu’un des paquets est satur´e, on alloue le mˆeme nombre de paquets, ce qui fait 4 au total. La fonction de hachage, compte tenu de la collision qui vient de se produire est alors sur 2 bits, et les valeurs dans les paquets initiaux sont r´eparties en fonction de la valeur de h(cl´e, c). Le param`etre c, qui indique le nombre de collisions, vaut alors 1. le proc´ed´e est r´eit´er´e ensuite autant de fois que n´ecessaire, mais la saturation de l’espace m´emoire peut intervenir `a tout moment.

Tête des classes paquet 0 paquet 1 paquet 00 paquet 01 paquet 10 paquet 11 0 1 00 01 11 10 Après saturation Avant saturation des paquets

Méthode de Fagin

La m´ethode de Litvin permet d’obtenir une croissance lin´eaire de l’espace m´emoire. Elle utilise une fonction de hachage et une fonction de collision. Supposons par exemple que h0 = cl´e modulo N, avec N=10. h0 fournit

donc les adresses de 10 blocs diff´erents.

Soit la fonction de collision hc+1 = hc + N×2c. Lors de la premi`ere collision, on cr´ee le nombre de blocs

n´ecessaires pour correspondre `a la valeur de hc+1. Si 26 est une cl´e, h0(26) vaut 6, et le 6eme bloc est satur´e.

h1(26) vaut 16. On cr´ee les blocs de 10 `a 16, et on redistribue certaines des valeurs des blocs de 0 `a 9 vers les

blocs de 10 `a 16, pour permettre des insertions directes vers les premiers blocs.

9 19 39 79 10 20 40 90 1 21 32 62 102

Bloc 0 Bloc 1 Bloc 2 Bloc 6 Bloc 9

6 16 36 56

. . . .

Les 2 dernières valeurs des blocs 0 et 6 sont réparties La valeur 26 est alors insérée dans le bloc 6.

Méthode de Litvin à croissance linéaire

dans les blocs vides 10 et 16, respectivement.

4.2

Index arborescents

Les index arborescents sont r´ealis´es `a partir d’arbres ´equilibr´es de la famille des B-arbres, principalement les arbres B+.

Un arbre B+ d’ordre d est un arbre totalement ´equilibr´e (toutes ses feuilles sont `a la mˆeme hauteur) dont les

nœuds sont compos´es d’un nombre de valeurs comprises entre d+1 et 2d+1 (sauf ´eventuellement la racine).

C1 P1 C2 P2 C3 P3 C4 P4 P0

Données < C1

Données dans [C1, C2[

Structure du noeud d’un B-Arbre de degré 2

La premi`ere valeur d’un nœud est une adresse (un pointeur), les autres sont des index : (cl´e, adresse). L’adresse correspond `a un autre nœud, de hauteur inf´erieure, ou `a une feuille. En ce qui concerne les feuilles, l’adresse est celle d’une page contenant le tuple recherch´e, et, sous Oracle, correspond au rowId. Pour les nœuds, l’adresse associ´ee `a Ci renvoit au nœud contenant les r´ef´erences des cl´es comprises entre Ci et Cj, Cj exclu.

rowid rowid rowid rowid rowid rowid ARBRE B+

La nombre de niveaux n´ecessaire pour stocker N cl´es est 1 + logd/2(N +1)2 et le coˆut d’un acc`es est en logdN .

A titre d’exemple, 3 acc`es suffisent pour 106 cl´es lorsque d = 200.

La principale difficult´e de gestion d’un B-arbre est de conserver les feuilles au mˆeme niveau lors des insertions et des suppressions. Rappelons les algorithmes expos´es dans le cours d’algorithmique.

4.2.1 Recherche

L’exploration du contenu d’un nœud se fait s´equentiellement dans l’ordre des champs, les cl´es ´etant stock´ees dans l’ordre alpha-num´erique.

Lorsque la cl´e cherch´ee n’est pas pr´esente, la recherche se poursuit au niveau du nœud point´e par l’index dont la cl´e est imm´ediatement inf´erieure. S’il n’en existe pas, c’est le pointeur ant´erieur P0qui indique le nœud suivant.

4.2.2 Insertion

On commence par effectuer une recherche du nœud o`u doit se faire l’insertion. S’il n’est pas satur´e, l’insertion se fait en r´eorganisant les index pr´esents de fa¸con `a respecter l’ordre alpha-num´erique.

Si le nœud est plein, il faut cr´eer un nouveau nœud, en ´eclatant celui qui est satur´e. Les index correspondant aux d premi`eres cl´es (les plus petites) restent sur place, les d plus grandes sont ins´er´ees dans le nouveau nœud, et la valeur m´ediane est remont´ee au niveau du nœud p`ere. Le processus est r´ep´et´e r´ecursivement si n´ecessaire. En cas de besoin, on cr´ee un nouveau nœud racine, ce qui permet `a l’arbre par le haut, les feuilles restant toujours

au mˆeme niveau.

66 78

66 69 71 76 78 84 93

66 71 78

Avant insertion Après insertion de la valeur 75

Insertion de la valeur 75 dans un arbre B+

66 69 71 75 76

4.2.3 Suppression

L’algorithme d´epend de la position de la valeur `a supprimer :

– Si le nombre d’index est sup´erieur `a d, on supprime la valeur du nœud que l’on r´eorganise.

– Si la valeur est situ´ee dans une feuille et que le nombre d’index qu’elle contient est ´egal `a d, on recombine les feuilles voisines.

– Si l’index est dans un nœud non feuille, on fait la suppression dans la feuille associ´ee et on r´eorganise r´ecursivement les nœuds sup´erieurs. Il est possible ainsi de supprimer la racine ; ce qui a poour cons´equence l’adoption d’une nouvelle racine au niveau inf´erieur et la diminution d’un niveau pour l’arbre.

66 120 260 66 91 105 66 68 75 68 120 260 68 91 105 68 75 Suppression de la clé 66

Documents relatifs