Test du stockage en colonnes (Columnar Storage)
Comme la plupart d'entre vous le savent probablement déjà, depuis environ la fin de 2022 InterSystems IRIS a inclus la fonctionnalité de stockage de colonnes dans sa base de données, eh bien, dans l'article d'aujourd'hui, nous allons la mettre à l'épreuve par rapport au stockage de rangées habituel.
Stockage de colonnes
Quelle est la principale caractéristique de ce type de stockage? Si nous consultons la documentation officielle, nous verrons ce tableau fantastique qui explique les principales caractéristiques des deux types de stockage (par rangées ou par colonnes):
.png)
Comme vous pouvez le constater, le stockage de colonnes est principalement conçu pour les tâches analytiques dans le cadre desquelles des requêtes sont lancées sur des champs spécifiques de notre tableau, tandis que le stockage de rangées est plus optimal lorsqu'un grand nombre d'opérations d'insertion, de mise à jour et de suppression sont nécessaires. ainsi que pour l'obtention d'enregistrements complets.
Si vous continuez la lecture de la documentation, vous verrez à quel point il est simple de configurer notre table pour qu'elle puisse utiliser le stockage de colonnes:
CREATETABLEtable (columntype, column2 type2, column3 type3) WITH STORAGETYPE = COLUMNAREn utilisant cette commande, nous définissons toutes les colonnes de notre tableau avec un stockage de colonnes, mais nous pouvons opter pour un modèle mixte où notre tableau dispose d'un stockage de rangées, mais dont certaines colonnes font appel à un stockage de colonnes.
Ce scénario mixte pourrait être intéressant lorsque des opérations d'agrégation telles que les sommes, les moyennes, etc. sont courantes. Dans un tel cas, nous pourrions définir la colonne qui utilisera le stockage en question:
CREATETABLEtable (columntype, column2 type2, column3 type3 WITH STORAGETYPE = COLUMNAR)Dans l'exemple précédent, nous avons défini une table avec un stockage de rangées et une colonne (column3) avec un stockage de colonnes.
Comparatif
Pour comparer le temps consacré au stockage de colonnes et au stockage de rangées dans des requêtes différentes, nous avons créé un petit exercice à l'aide de Jupyter Notebook qui insère une série d'enregistrements que nous générons dans deux tables, la première avec un stockage de rangées (Test.PurchaseOrderRow) et la seconde avec un stockage de rangées dans les deux colonnes (Test.PurchaseOrderColumnar)
Test.PurchaseOrderRow
CREATETABLE Test.PurchaseOrderRow (
ReferenceINTEGER,
Customer VARCHAR(225),
PaymentDate DATE,
Vat NUMERIC(10,2),
Amount NUMERIC(10,2),
StatusVARCHAR(10))Test.PurchaseOrderColumnar
CREATETABLE Test.PurchaseOrderColumnar (
ReferenceINTEGER,
Customer VARCHAR(225),
PaymentDate DATE,
Vat NUMERIC(10,2),
Amount NUMERIC(10,2) WITH STORAGETYPE = COLUMNAR,
StatusVARCHAR(10) WITH STORAGETYPE = COLUMNAR)Si vous téléchargez le projet Open Exchange et le déployez dans votre Docker local, vous pouvez accéder à l'instance Jupyter Notebook et examiner le fichier PerformanceTests.ipynb, qui sera responsable de la génération des données aléatoires que nous allons stocker en différentes étapes dans nos tables et enfin il nous montrera un graphique avec la performance des opérations d'interrogation.
Jetons un coup d'œil rapide à la configuration de notre projet:
docker-compose.yml
version:'3.7'services:# iris iris: init:true container_name:iris build: context:. dockerfile:iris/Dockerfile ports: -52774:52773 -51774:1972 volumes: -./shared:/shared environment: -ISC_DATA_DIRECTORY=/shared/durable command:--check-capsfalse--ISCAgentfalse# jupyter notebook jupyter: build: context:. dockerfile:jupyter/Dockerfile container_name:jupyter ports: -"8888:8888" environment: -JUPYTER_ENABLE_LAB=yes -JUPYTER_ALLOW_INSECURE_WRITES=true volumes: -./jupyter:/home/jovyan -./data:/app/data command:"start-notebook.sh --NotebookApp.token='' --NotebookApp.password=''"Nous déployons les conteneurs IRIS et Jupyter dans notre docker, en configurant d'abord IRIS avec l'espace de noms "TEST" et les deux tables requises pour le test.
Pour que vous ne vous ennuyiez pas avec du code, vous pouvez consulter le fichier PerformanceTests.ipynb à partir duquel nous allons nous connecter à IRIS, générer les enregistrements à insérer et les stocker dans IRIS
Exécution du test
Les résultats ont été les suivants (en secondes):
Inserts:
Les inserts effectuées sont de type "bulk":
INSERTINTO Test.PurchaseOrderColumnar (Reference, Customer, PaymentDate, Vat, Amount, Status) VALUES (?, ?, ?, ?, ?, ?)Le temps nécessaire pour chaque insert batch est le suivant:
Nombre total d'inserts | Stockage de rangées | Stockage mixte |
| 1000 | 0.031733 | 0.041677 |
| 5000 | 0.159338 | 0.185252 |
| 20000 | 0.565775 | 0.642662 |
| 50000 | 1.486459 | 1.747124 |
| 100000 | 2.735016 | 3.265492 |
| 200000 | 5.395032 | 6.382278 |
Sélections:
La sélection lancée inclut une fonction d'agrégation et une condition, toutes deux sur des colonnes avec stockage de colonnes:
SELECTAVG(Amount) FROM Test.PurchaseOrderColumnar WHEREStatus = 'SENT'Nombre total de lignes | Stockage de rangées | Stockage mixte |
| 1000 | 0.002039 | 0.001178 |
| 5000 | 0.00328 | 0.000647 |
| 20000 | 0.005493 | 0.001555 |
| 50000 | 0.016616 | 0.000987 |
| 100000 | 0.036112 | 0.001605 |
| 200000 | 0.070909 | 0.002738 |
.png)
Conclusions
Comme vous pouvez le voir dans les résultats obtenus, l'opération correspond exactement à ce qui est indiqué dans la documentation. L'inclusion de colonnes avec stockage de colonnes pénalise légèrement les performances au cours des inserts (environ 18% plus lent pour notre exemple) alors que les requêtes sur ces mêmes colonnes améliorent considérablement le temps de réponse (258 fois plus rapide).
Il s'agit sans aucun doute d'un élément à prendre en compte lors de la planification du développement de toute application.
.png)