Les globals sont des épées au trésor pour stocker des données. Des arbres. Partie 1

Les globals sont des épées au trésor pour stocker des données. Des arbres. Partie 1 Les véritables épées de base de données - les globales - sont connues depuis longtemps, mais rares sont ceux qui savent comment les utiliser efficacement ou ne possèdent pas du tout cette super-arme.

Si vous utilisez des solutions globales pour résoudre les problèmes pour lesquels ils excellent, vous pouvez obtenir des résultats exceptionnels. Soit en productivité, soit en simplification de la solution du problème (1, 2).

Les globaux sont une manière particulière de stocker et de traiter des données, complètement différente des tables SQL. Ils sont apparus en 1966 dans la langue OREILLONS) (développement évolutif - Cache ObjectScript, ci-après COS) dans la base de données médicale et y est toujours activement utilisé, et a également pénétré d'autres domaines où fiabilité et haute performance sont requises : finance, trading, etc.

Les globaux dans les SGBD modernes prennent en charge les transactions, la journalisation, la réplication et le partitionnement. Ceux. ils peuvent être utilisés pour construire des systèmes modernes, fiables, distribués et rapides.

Les globaux ne vous limitent pas au modèle relationnel. Ils vous donnent la liberté de développer des structures de données optimisées pour des tâches spécifiques. Pour de nombreuses applications, l’utilisation intelligente des variables globales peut véritablement constituer une arme secrète, offrant des performances dont les développeurs d’applications relationnelles ne peuvent que rêver.

Les globaux comme moyen de stocker des données peuvent être utilisés dans de nombreux langages de programmation modernes, à la fois de haut niveau et de bas niveau. Par conséquent, dans cet article, je me concentrerai spécifiquement sur les globaux, et non sur le langage dont ils provenaient autrefois.

2. Comment fonctionnent les globaux

Comprenons d’abord comment fonctionnent les sociétés mondiales et quelles sont leurs forces. Les globals peuvent être considérés sous différents points de vue. Dans cette partie de l’article, nous les considérerons comme des arbres. Ou comme des entrepôts de données hiérarchiques.

Pour faire simple, un global est un tableau persistant. Un tableau automatiquement enregistré sur le disque.
Il est difficile d'imaginer quelque chose de plus simple pour stocker des données. Dans le code (dans les langages COS/M), il ne diffère d'un tableau associatif régulier que par le symbole ^ avant le nom.

Pour enregistrer des données de manière globale, vous n'avez pas besoin d'apprendre le langage de requête SQL, les commandes pour travailler avec elles sont très simples. Ils peuvent être appris en une heure.

Commençons par l'exemple le plus simple. Arbre de plain-pied à 2 branches. Les exemples sont écrits en COS.

Les globals sont des épées au trésor pour stocker des données. Des arbres. Partie 1

Set ^a("+7926X") = "John Sidorov"
Set ^a("+7916Y") = "Sergey Smith"



Lors de l'insertion d'informations dans un global (commande Set), 3 choses se produisent automatiquement :

  1. Sauvegarde des données sur le disque.
  2. Indexage. Ce qui est entre parenthèses est la clé (dans la littérature anglaise - « indice »), et à droite des égaux se trouve la valeur (« valeur de nœud »).
  3. Tri Les données sont triées par clé. À l'avenir, lors de la traversée du tableau, le premier élément sera « Sergey Smith » et le second « John Sidorov ». Lors de la réception d'une liste d'utilisateurs du global, la base de données ne perd pas de temps à trier. De plus, vous pouvez demander la sortie d'une liste triée, à partir de n'importe quelle clé, même inexistante (la sortie commencera à partir de la première vraie clé, qui vient après celle qui n'existe pas).

Toutes ces opérations se déroulent incroyablement rapidement. Sur mon ordinateur personnel, j'obtenais des valeurs allant jusqu'à 750 000 insertions/s en un seul processus. Sur les processeurs multicœurs, les valeurs peuvent atteindre des dizaines de millions insertions/sec.

Bien entendu, la vitesse d’insertion elle-même ne dit pas grand-chose. Vous pouvez, par exemple, écrire très rapidement des informations dans des fichiers texte - comme ceci rumeur Le traitement des visas fonctionne. Mais dans le cas des globaux, nous obtenons ainsi un stockage indexé structuré, qui peut être utilisé facilement et rapidement à l'avenir.

Les globals sont des épées au trésor pour stocker des données. Des arbres. Partie 1

  • La plus grande force des globals est la vitesse à laquelle de nouveaux nœuds peuvent être insérés.
  • Les données globales sont toujours indexées. Les parcourir, à la fois au même niveau et profondément dans l’arbre, est toujours rapide.

Ajoutons quelques branches supplémentaires des deuxième et troisième niveaux au global.

Set ^a("+7926X", "city") = "Moscow"
Set ^a("+7926X", "city", "street") = "Req Square"
Set ^a("+7926X", "age") = 25
Set ^a("+7916Y", "city") = "London"
Set ^a("+7916Y", "city", "street") = "Baker Street"
Set ^a("+7916Y", "age") = 36

Les globals sont des épées au trésor pour stocker des données. Des arbres. Partie 1

Il est évident que des arbres multi-niveaux peuvent être construits sur la base de valeurs globales. De plus, l'accès à n'importe quel nœud est presque instantané grâce à l'auto-indexation lors de l'insertion. Et à n’importe quel niveau de l’arborescence, toutes les branches sont triées par clé.

Comme vous pouvez le constater, les informations peuvent être stockées à la fois dans une clé et dans une valeur. La longueur totale de la clé (la somme des longueurs de tous les index) peut atteindre Octets 511, et les valeurs 3.6 MB pour le cache. Le nombre de niveaux dans l'arborescence (nombre de dimensions) est de 31.

Autre point intéressant. Vous pouvez construire un arbre sans préciser les valeurs des nœuds des niveaux supérieurs.

Les globals sont des épées au trésor pour stocker des données. Des arbres. Partie 1

Set ^b("a", "b", "c", "d") = 1
Set ^b("a", "b", "c", "e") = 2
Set ^b("a", "b", "f", "g") = 3

Les cercles vides sont des nœuds auxquels aucune valeur n’est attribuée.

Afin de mieux comprendre les globaux, comparons-les avec d'autres arbres : les arbres de jardin et les arbres de noms de systèmes de fichiers.

Comparons les arbres sur les globaux avec les structures hiérarchiques les plus familières : avec les arbres ordinaires qui poussent dans les jardins et les champs, ainsi qu'avec les systèmes de fichiers.

Les globals sont des épées au trésor pour stocker des données. Des arbres. Partie 1

Comme on le voit chez les arbres de jardin, les feuilles et les fruits ne se trouvent qu’aux extrémités des branches.
Systèmes de fichiers : les informations sont stockées uniquement aux extrémités des branches, qui sont des noms de fichiers complets.

Et voici la structure globale des données.

Les globals sont des épées au trésor pour stocker des données. Des arbres. Partie 1Différences

  1. Nœuds internes : les informations dans un global peuvent être stockées dans chaque nœud, pas seulement aux extrémités des branches.
  2. Nœuds externes : Le global doit avoir des valeurs définies aux extrémités des branches, contrairement aux FS et aux arbres de jardin.



En termes de nœuds internes, nous pouvons dire que la structure du global est un surensemble de la structure des arbres de noms dans les systèmes de fichiers et les arbres de jardin. Ceux. plus flexible.

En général, le global est arbre ordonné avec la possibilité de stocker des données dans chaque nœud.

Pour mieux comprendre le travail des globaux, imaginez ce qui se passerait si les créateurs de systèmes de fichiers utilisaient une approche similaire aux globaux pour stocker les informations ?

  1. La suppression d'un seul fichier dans un répertoire supprimerait automatiquement le répertoire, ainsi que tous les répertoires sus-jacents contenant uniquement le répertoire qui vient d'être supprimé.
  2. Il n’y aurait pas besoin de répertoires. Il y aurait simplement des fichiers avec des sous-fichiers et des fichiers sans sous-fichiers. Si on la compare à un arbre ordinaire, chaque branche deviendrait un fruit.

    Les globals sont des épées au trésor pour stocker des données. Des arbres. Partie 1

  3. Des éléments tels que les fichiers README.txt peuvent ne pas être nécessaires. Tout ce qui devait être dit sur le contenu du répertoire pouvait être écrit dans le fichier répertoire lui-même. Dans l'espace du chemin, le nom du fichier ne peut pas être distingué du nom du répertoire, il était donc possible de se contenter de fichiers.
  4. La vitesse de suppression des répertoires contenant des sous-répertoires et des fichiers imbriqués augmenterait considérablement. À plusieurs reprises sur Habré, il y a eu des articles sur la durée et la difficulté de supprimer des millions de petits fichiers (1, 2). Cependant, si vous créez un pseudo-système de fichiers sur une base globale, cela prendra des secondes ou des fractions de secondes. Lorsque j'ai testé la suppression de sous-arborescences sur un ordinateur personnel, cela a supprimé 1 à 96 millions de nœuds d'une arborescence à deux niveaux sur un disque dur (et non un SSD) en 341 seconde. De plus, nous parlons de supprimer une partie de l'arborescence, et pas seulement l'intégralité du fichier avec les globales.

Les globals sont des épées au trésor pour stocker des données. Des arbres. Partie 1
La suppression des sous-arbres est un autre point fort des globals. Vous n'avez pas besoin de récursion pour cela. Cela se produit incroyablement rapidement.

Dans notre arbre, cela pourrait être fait avec la commande Tuer.

Kill ^a("+7926X")

Les globals sont des épées au trésor pour stocker des données. Des arbres. Partie 1

Pour une meilleure compréhension des actions dont nous disposons sur les globals, je vais vous proposer un petit tableau.

Commandes et fonctions de base pour travailler avec des globales dans COS

Ensemble
Définition des branches sur un nœud (s'il n'est pas encore défini) et des valeurs de nœud

aller
Copier un sous-arbre

Tuer
Supprimer un sous-arbre

ZTuer
Suppression de la valeur d'un nœud spécifique. Le sous-arbre émergeant du nœud n'est pas touché

$Requête
Traversée complète de l'arbre, en pénétrant profondément dans l'arbre

$Commande
Traversée des branches d'un nœud spécifique

$Données
Vérifier si un nœud est défini

Incrément $
Incrémentation atomique d'une valeur de nœud. Pour éviter de faire des lectures et des écritures, pour ACID. Récemment, il a été recommandé de passer à $Séquence

Merci de votre attention, nous sommes prêts à répondre à vos questions.

Clause de non-responsabilité  : Cet article et mes commentaires sont mon opinion et n'ont aucun rapport avec la position officielle d'InterSystems Corporation.

Extension Les globals sont des épées au trésor pour stocker des données. Des arbres. Partie 2. Vous apprendrez quels types de données peuvent être affichées sur les globaux et sur quelles tâches elles offrent le maximum d'avantages.

Source: habr.com

Ajouter un commentaire