EP 2 234 022 A1
4
5
10
15
20
25
30
35
40
45
50
55
partitionnement reste avant tout un moyen de construire les indexes pour une période de temps, sans avoir à revenir
par la suite sur une période déjà traitée. Cela permet de transformer un problème d’optimisation globale en un problème
d’optimisation local, la localité étant une localité temporelle.
[0021] Le partitionnement consiste à diviser une table SQL. Cette division est définie par des règles de segmentation
appliquées à un sous-ensemble des valeurs des colonnes. MySQL 5.1 propose un partitionnement standard qui comporte
trop de restrictions. En particulier la base doit être capable de lire toutes les partitions en même temps ; cela induit une
contrainte forte pour le système d’exploitation sur le nombre de fichiers ouverts simultanément. Cette contrainte ne
permet pas de mettre en oeuvre le partitionnement massif selon la présente invention. Ainsi, dans le cas de tables selon
l’invention, une table a toujours une colonne ’timestamp’ et la table est partitionnée par intervalles de temps qui peuvent
être de l’ordre de la minute ; la politique de rétention peut être de l’ordre d’une ou plusieurs années.
[0022] Le partitionnement selon l’invention est géré par le moteur de stockage. Chaque partition possède ses index.
Les partitions peuvent être parcourues en parallèle afin de diminuer le temps de réponse sur des systèmes multi-coeurs
ou multiprocesseurs.
[0023] Les fichiers de partition sont regroupés dans des sous-répertoires d’un système de fichier. Ces répertoires
forment un arbre dont chaque noeud est identifié de façon unique à partir d’un timestamp comme indiqué par la figure
1. Cette figure montre l’arborescence des partitions pour la table ’ipp’. Les noms de fichier avec le suffixe ’.spd’ corres-
pondent aux fichiers de données et ceux avec le suffixe ’.spi’ aux fichiers d’indexes. Les fichiers ’spi’ sont au nombre
de 7 pour une partition car la table ’ipp’ possède 7 indexes. L’arborescence possède un nombre de niveaux qui dépend
de l’intervalle de temps utilisé pour le partitionnement.
[0024] La base de données selon l’invention comporte la possibilité de définir un intervalle de temps différent pour le
partitionnement en fonction de l’âge des données. Par exemple, les données du mois en cours sont partitionnées à
l’heure, puis les données des trois mois suivants sont partitionnées à la journée ; enfin les données plus anciennes sont
partitionnées au mois.
[0025] Le système a donc la possibilité de fusionner les partitions en partitions plus importantes au fur et à mesure
que les données qu’elles contiennent vieillissent. Cette opération est faite en utilisant la colonne ’timestamp’.
[0026] Par ailleurs, afin d’optimiser les insertions, on construit les partitions en mémoire avant de les écrire sur disque.
Pour fournir un accès temps réel aux données, les requêtes SQL peuvent prendre en compte les données en mémoire
avant qu’elles soient écrites sur le disque. Cette fonctionnalité bénéficie de la fusion de partition. Cette dernière permet
de garder une taille de partition compatible avec la mémoire disponible pour la construction des partitions.
[0027] Chaque partition est composée d’un fichier de données (« data file ») et d’un fichier pour chacun des indexes.
La figure 2 décrit la structure d’un fichier d’index pour une partition. Un fichier d’index consiste en un en-tête (« header »),
un arbre binaire (« binary tree »), une section de chaines de caractère (« String table »), ainsi qu’une section optionnelle
pour les valeurs de l’index (« index values »). L’espace alloué à l’arbre binaire est limité ; si la limite n’est pas atteinte
chaque noeud de l’arbre contient les valeurs d’index correspondant à une ligne de la table, sinon les valeurs de l’index
sont stockées dans la section optionnelle à la fin du fichier.
[0028] Les arbres binaires sont produits grâce une fonction bijective TreeOrder. Cette fonction permet de générer un
arbre binaire parfait pour un index et de l’écrire séquentiellement dans un fichier. Un arbre binaire parfait permet d’éliminer
la moitié des valeurs restantes à chaque fois que le parcours de l’arbre s’enfonce d’un niveau de profondeur supplé-
mentaire.
[0029] Soit (Vi),i ∈ [0,n], une liste de valeurs pour lesquelles il existe une relation d’ordre et soit O, une fonction telle
que si O(i) > O(j) alors Vo(i) ≥ Vo(j).
[0030] A titre d’exemple, pour une suite de 7 éléments:
V0, V1, V2, V3, V4, V5, V6.
[0031] Une fois triée selon une relation d’ordre, cette liste est la suivante :
V2, V4, V1, V6, V3, V5, V0
[0032] Donc O(0) = 2, O(1) = 4, O(2) = 1, O(3) = 6, O(4)=3, O(5)=5 et O(6) = 0. Soit V’ la suite définie par V’i = Vo(i),
alors la suite (V2, V4, V1, V6, V3, V5, V0) s’écrit aussi (V’0, V’1, V’2, V’3, V’4, V’5, V’6).
[0033] L’arbre binaire parfait contenant tous les éléments de la liste (Vi) est décrit par la figure 3. En effet, soit v une
valeur pour laquelle la fonction d’ordre est définie. Pour savoir si v est une valeur de la suite V, il suffit de comparer v
et V’3. Si v < V’3 alors v doit être comparée à V’1. Si v < V’1, v est comparée V’0. Si v < V’0 alors v n’appartient pas la
liste et cela a été trouvé en 3 itérations. Quand v est supérieur à la valeur du noeud, il suffit de comparer v au noeud
enfant de droite.
[0034] Si on numérote les noeuds de l’arbre de la figure 3 de haut en bas et de gauche à droite on obtient le résultat
de la figure 4.