Une base de données orientée colonnes est un système de gestion de base de données (SGBD) qui stocke les tableaux de données par colonne et non par ligne.
L'orientation colonne permet un accès plus efficace aux données pour interroger un sous-ensemble de colonnes (en éliminant le besoin de lire les colonnes qui ne sont pas pertinentes), et plus d'options pour la compression des données. La compression par colonne est aussi plus efficace lorsque les données de la colonne se ressemblent. Cependant, elles sont généralement moins efficaces pour insérer de nouvelles données.
L'utilisation pratique d'un stockage en colonnes par rapport à un stockage en lignes diffère peu dans le monde des bases de données relationnelles . Les bases de données en colonnes et en lignes peuvent toutes deux utiliser des langages d'interrogation de base de données traditionnels tels que SQL pour charger des données et effectuer des requêtes. Les bases de données en colonnes et en lignes peuvent devenir l'épine dorsale d'un système pour servir les données aux outils courants d'extract-transform-load (ETL) et de visualisation des données.
Description Un système de base de données relationnelle doit présenter ses données sous une forme de table à deux dimensions, en lignes et colonnes, mais ne peut être stockée que sous une forme à une seule dimension.
Par exemple, une base de données pourrait contenir cette table :
RowId EmpId Nom Prénom Salaire001 10 Durant Jacques 40000002 12 Dupont Marie 50000003 11 Martin Jeanne 4400000422DupontRobert94000
Cette table simple inclut un identifiant de ligne rowid, un identifiant d'employé empid, des colonnes Nom et Prénom, et un salaire. Ce format bidimensionnel est une abstraction. Dans une mise en œuvre réelle, le matériel de stockage exige que les données soient rangées en colonnes.
Cette table peut être présente dans la mémoire de l'ordinateur (RAM) ou sur son disque dur. Bien que la mémoire RAM et les disques durs fonctionnent différemment, le système d'exploitation les abstrait. Ainsi, la table à deux dimensions vue par l'utilisateur est représentée par le système de gestion de la base de données comme une suite d'octets pour que le système d'exploitation puisse l'écrire en mémoire ou sur le disque.
Les opérations les plus coûteuses impliquant les disques durs sont les fonctions de recherche. Afin d'améliorer les performances globales, les données connexes doivent être stockées de manière à minimiser le nombre de recherches. C'est ce qu'on appelle le principe de localité, et le concept de base apparaît dans des contextes différents. Les disques durs sont organisés en une série de blocs d'une taille fixe, généralement suffisante pour stocker plusieurs lignes de la table. En organisant les données de la table de manière que les lignes s'insèrent dans ces blocs, et en regroupant les lignes apparentées dans des blocs séquentiels, le nombre de blocs qui doivent être lus ou recherchés est le plus souvent minimisé, ainsi que le nombre de recherches.
Une étude de Pinnecke et al. couvre les techniques d'hybridation colonnes/lignes en 2017.
Base de données orientées lignes
Une table de données orientée lignes sérialise toutes les valeurs d'une ligne ensemble, puis les valeurs de la ligne suivante
001:10,Durant,Jacques,40000; 002:12,Dupont,Marie,50000; 003:11,Martin,Jeanne,44000; 004:22,Dupont,Robert,94000;
Lorsque les données sont insérées dans la table, un ID interne leur est attribué, l’identifiant de colonne rowid qui est utilisé en interne dans le système pour faire référence aux données. Dans ce cas, les enregistrements ont des identifiants de colonne séquentiels indépendants de l'empid attribué par l'utilisateur. Dans cet exemple, le SGBD utilise des entiers courts pour stocker les rowid. Dans la pratique, des nombres plus grands, de 64 ou 128 bits, sont normalement utilisés.
Les systèmes orientés ligne sont conçus pour retourner efficacement les données d'une ligne entière, ou enregistrement, en un minimum d'opérations. Cela correspond au cas d'utilisation courant où le système tente de récupérer des informations sur un objet particulier, par exemple les coordonnées d'un utilisateur dans un système rolodex ou des informations sur un produit dans un système de commerce en ligne. En stockant les données de l'enregistrement dans un seul bloc sur le disque, avec les enregistrements associés, le système peut récupérer rapidement les enregistrements avec un minimum d'opérations sur le disque.
Les systèmes orientés ligne ne sont pas efficaces pour effectuer des opérations sur l'ensemble de la table, par opposition à un petit nombre d'enregistrements spécifiques. Par exemple, pour trouver tous les enregistrements de la table d'exemple dont les salaires sont compris entre et , le SGBD devrait parcourir l'ensemble de la table à la recherche d'enregistrements correspondants. Si le tableau d'exemple présenté ci-dessus tient probablement dans un seul bloc de disque, ce n'est pas le cas d'un tableau comportant ne serait-ce que quelques centaines de lignes, et plusieurs opérations sur disque seraient nécessaires pour récupérer les données et les examiner.
Pour améliorer les performances de ce type d'opérations (qui sont très courantes et constituent généralement l'intérêt d'utiliser un SGBD), la plupart des SGBD prennent en charge l'utilisation d'index de base de données, qui stockent toutes les valeurs d'un ensemble de colonnes avec des indicateurs rowid vers la table d'origine.
Un index sur la colonne salaire ressemblerait à ceci:
55000:004; 60000:001; 80000:002; 94000:003;
Comme ils ne stockent que des éléments de données uniques, plutôt que des lignes entières, les index sont généralement beaucoup plus petits que dans les stockages de la table principale. L'analyse de cet ensemble de données plus petit réduit le nombre d'opérations sur le disque. Si l'index est fortement utilisé, il peut réduire considérablement le temps des opérations courantes. Cependant, la maintenance des index ajoute une surcharge au système, en particulier lorsque de nouvelles données sont écrites dans la base de données. Les enregistrements doivent non seulement être stockés dans la table principale, mais les index qui y sont rattachés doivent également être mis à jour.
La principale raison pour laquelle les index améliorent considérablement les performances sur les grands ensembles de données est que les index des bases de données sur une ou plusieurs colonnes sont généralement triés par valeur, ce qui rend les opérations de requêtes de plage (comme l'exemple ci-dessus "trouver tous les enregistrements dont le salaire est compris entre ") très rapides.
Un certain nombre de bases de données orientées lignes sont conçues pour tenir entièrement dans la mémoire vive, une base de données en mémoire. Ces systèmes ne dépendent pas des opérations sur disque et ont un accès simultané à l'ensemble des données. Cela réduit le besoin d'index, car il faut le même nombre d'opérations pour analyser complètement les données d'origine qu'un index complet à des fins d'agrégation typique. Ces systèmes peuvent donc être plus simples et plus petits, mais ne peuvent gérer que des bases de données qui tiennent en mémoire.
Base de données orientées colonnes Une base de données orientée colonne organise en série toutes les valeurs d'une colonne, puis les valeurs de la colonne suivante, et ainsi de suite.
Pour notre table d'exemple, les données seraient stockées de cette manière :
10:001,12:002,11:003,22:004; Durant:001,Dupont:002,Martin:003,Dupont:004; Jacques:001,Marie:002,Jeanne:003,Robert:004; 40000:001,50000:002,44000:003,94000:004;
Dans cette disposition, n'importe laquelle des colonnes correspond à une structure plus proche d'un index d’un système orienté ligne. Cela peut prêter à confusion et mener à l’opinion erroné qu'une base de données orienté colonne "n'est en fait qu'une" base de données orientées en ligne avec un index sur chaque colonne. Cependant, c'est l’organisation des données qui diffère radicalement. Dans un système orienté ligne, les indices font correspondre les valeurs des colonnes aux numéros de ligne, alors que dans un système orienté colonne, les colonnes font correspondre les numéros de ligne aux valeurs des colonnes. Cela peut sembler subtil, mais la différence peut être observée lors de la modification du stockage dans lequel les deux éléments "Dupont", ci-dessus, sont comprimés en un seul élément avec deux numéros de ligne :
…;Durant:001;Dupont:002,004;Martin:003;…
Le fait qu'un système orienté colonnes soit plus efficace ou non dépend fortement de la charge de travail à automatiser. Les opérations qui récupèrent toutes les données d'un objet donné (la ligne entière) sont plus lentes. Un système orienté ligne peut récupérer la ligne en une seule lecture du disque, alors que de nombreuses opérations sur le disque sont nécessaires pour collecter les données de plusieurs colonnes dans une base de données orientée colonne. Cependant, les opérations sur une rangée entière sont généralement rares.
Dans la majorité des cas, seul un sous-ensemble limité de données est récupéré. Dans une application rolodex, par exemple, il est beaucoup plus courant de collecter les noms et prénoms de plusieurs lignes pour établir une liste de contacts que de lire toutes les données d'une seule adresse. C’est encore plus vrai pour écrire dans la base de données, en particulier si les données ont tendance à être "clairsemés" avec de nombreuses colonnes facultatives. C'est pourquoi les bases de données orientées colonnes ont démontré d'excellentes performances, malgré de nombreux inconvénients théoriques.
Le partitionnement, l'indexation, les caches, les vues, les cubes OLAP et les systèmes transactionnels tel que le write ahead logging ou le Multiversion Concurrency Control changent tous drastiquement l'organisation physique des données.
Avantages
Temps d'accès Les comparaisons entre les bases de données orientées lignes et colonnes portent généralement sur l'efficacité de l'accès au disque dur pour une charge de travail donnée, car le temps de recherche est incroyablement long par rapport aux autres goulots d'étranglement des ordinateurs. Par exemple, un disque dur Serial ATA (SATA) typique a un temps de recherche moyen compris entre 16 et 22 millisecondes, alors que l'accès à la DRAM (mémoire vive dynamique) sur un processeur Intel Core i7 prend en moyenne 60 nanosecondes, soit près de plus vite. Les bases de données en colonnes améliorent les performances en réduisant la quantité de données à lire sur le disque, à la fois en compressant efficacement les données en colonnes similaires et en ne lisant que les données nécessaires pour répondre à la requête.