La version 0.6.0 de la base de donnĂ©es DuckDB est maintenant disponible, combinant des caractĂ©ristiques de SQLite, telles que la compacitĂ©, la possibilitĂ© dâintĂ©gration sous forme de bibliothĂšque embarquĂ©e, le stockage de la base de donnĂ©es dans un seul fichier et une interface en ligne de commande conviviale, avec des outils et des optimisations pour exĂ©cuter des requĂȘtes analytiques sur une part significative des donnĂ©es stockĂ©es, par exemple, en effectuant l'agrĂ©gation de tout le contenu des tableaux ou en fusionnant plusieurs grands tableaux. Le code du projet est distribuĂ© sous la licence MIT. Le dĂ©veloppement est encore au stade de formation de versions expĂ©rimentales, car le format de stockage n'est pas encore stabilisĂ© et change d'une version Ă l'autre.
DuckDB propose un dialecte SQL Ă©tendu, incluant des fonctionnalitĂ©s supplĂ©mentaires pour traiter des requĂȘtes trĂšs complexes et de longue durĂ©e. L'utilisation de types complexes (tableaux, structures, unions) est supportĂ©e, ainsi que la possibilitĂ© d'exĂ©cuter des sous-requĂȘtes corrĂ©lĂ©es arbitraires et imbriquĂ©es. L'exĂ©cution simultanĂ©e de plusieurs requĂȘtes est prise en charge, ainsi que l'exĂ©cution de requĂȘtes directement Ă partir de fichiers au format CSV et Parquet. Il est possible d'importer des donnĂ©es depuis la base de donnĂ©es PostgreSQL.
En plus du code Shell provenant de SQLite, le projet utilise un parseur extrait de PostgreSQL, le composant Date Math de MonetDB, sa propre implĂ©mentation de fonctions de fenĂȘtre (basĂ©e sur l'algorithme Segment Tree Aggregation), un gestionnaire d'expressions rĂ©guliĂšres basĂ© sur la bibliothĂšque RE2, son propre optimiseur de requĂȘtes, un mĂ©canisme de contrĂŽle de concurrence multi-version (Multi-Version Concurrency Control), ainsi qu'un moteur d'exĂ©cution de requĂȘtes vectorisĂ© basĂ© sur l'algorithme Hyper-Pipelining Query Execution, permettant de traiter de grands ensembles de valeurs en une seule opĂ©ration.
Parmi les changements de la nouvelle version :
- Le travail sur l'amĂ©lioration du format de stockage se poursuit. Un mode d'Ă©criture optimiste sur disque a Ă©tĂ© mis en Ćuvre, dans lequel, lors du chargement d'un ensemble de donnĂ©es volumineux en une seule transaction, les donnĂ©es sont compressĂ©es et Ă©crites en mode flux dans le fichier de la base de donnĂ©es, sans attendre la confirmation de la transaction par la commande COMMIT. Lorsque la commande COMMIT est reçue, les donnĂ©es sont dĂ©jĂ Ă©crites sur le disque, et en cas de ROLLBACK, elles sont abandonnĂ©es. Auparavant, les donnĂ©es Ă©taient d'abord complĂštement enregistrĂ©es en mĂ©moire, puis enregistrĂ©es sur disque au moment du commit.
- Le support du chargement parallĂšle des donnĂ©es dans des tables distinctes a Ă©tĂ© ajoutĂ©, permettant d'augmenter considĂ©rablement la vitesse de chargement sur les systĂšmes multicĆurs. Par exemple, dans la version prĂ©cĂ©dente, le chargement d'une base de donnĂ©es de 150 millions de lignes sur un CPU Ă 10 cĆurs prenait 91 secondes, tandis que dans la nouvelle version, cette opĂ©ration s'effectue en 17 secondes. Deux modes de chargement parallĂšle sont prĂ©vus â avec ou sans maintien de lâordre des enregistrements.
- Pour la compression des données, l'algorithme FSST (Fast Static Symbol Table) a été utilisé, permettant de compresser les données à l'intérieur des chaßnes en utilisant un dictionnaire partagé de correspondances typiques. L'application de ce nouvel algorithme a permis de réduire la taille de la base de données de test de 761 Mo à 251 Mo.
- Pour la compression des nombres à virgule flottante (DOUBLE et FLOAT), les algorithmes Chimp et Patas ont été proposés. Par rapport à l'algorithme Gorillas utilisé auparavant, Chimp offre un niveau de compression supérieur et un décompression plus rapide. L'algorithme Patas est moins performant en termes de compression par rapport à Chimp, mais il est significativement plus rapide en termes de décompression, le temps étant presque identique à celui de la lecture des données non compressées.
- Une fonctionnalité expérimentale de chargement de données depuis des fichiers CSV en plusieurs flux parallÚles (SET experimental_parallel_csv=true) a été ajoutée, ce qui réduit considérablement le temps de chargement des grands fichiers CSV. Par exemple, avec l'option activée, le temps de chargement d'un fichier CSV de 720 Mo est passé de 3,5 à 0,6 seconde.
- La possibilitĂ© d'exĂ©cution parallĂšle des opĂ©rations de crĂ©ation et de gestion des index a Ă©tĂ© mise en Ćuvre. Par exemple, l'exĂ©cution de l'opĂ©ration CREATE INDEX pour une colonne contenant 16 millions d'enregistrements a Ă©tĂ© rĂ©duite de 5,92 Ă 1,38 seconde.
- L'opĂ©ration d'agrĂ©gation dans les requĂȘtes contenant l'expression «COUNT(DISTINCT col)» a Ă©tĂ© parallĂ©lisĂ©e.
- Le support du type UNION a été ajouté à SQL, permettant l'association de plusieurs types à un seul élément (par exemple, «UNION(num INT, error VARCHAR))»).
- SQL permet dĂ©sormais de crĂ©er des requĂȘtes commençant par le mot «FROM» au lieu de «SELECT». Dans ce cas, il est sous-entendu que la requĂȘte commence par «SELECT *».
- SQL a ajoutĂ© le support de l'expression «COLUMNS», permettant d'effectuer une opĂ©ration sur plusieurs colonnes sans duplication de l'expression. Par exemple, «SELECT MIN(COLUMNS(*)) from obs;» exĂ©cutera la fonction MIN pour chaque colonne de la table obs, tandis que «SELECT COLUMNS(âval[0-9]+â) from obs;» sĂ©lectionnera les colonnes dont le nom est composĂ© de «val» et de chiffres.
- Le support des opérations sur les listes a été ajouté, par exemple, «SELECT [x + 1 for x in [1, 2, 3]] AS l;».
- Une optimisation de la consommation de mémoire a été effectuée. Par défaut, sur la plateforme Linux, la bibliothÚque jemalloc est utilisée pour la gestion de la mémoire. La performance des opérations de jointure de hachages a été considérablement améliorée avec une mémoire limitée.
- Un mode d'affichage «.mode duckbox» a Ă©tĂ© ajoutĂ© Ă l'interface de ligne de commande, Ă©liminant les colonnes intermĂ©diaires en tenant compte de la largeur de la fenĂȘtre du terminal (adaptĂ© pour une Ă©valuation rapide des rĂ©sultats des requĂȘtes avec un grand nombre de colonnes, comme «SELECT * FROM tbl», qui dans le mode normal se rĂ©partissent sur plusieurs lignes). Avec le paramĂštre «.maxrows X», il est Ă©galement possible de limiter le nombre de lignes affichĂ©es.
- L'autocomplétion de la saisie en tenant compte du contexte a été intégrée dans le CLI (les mots-clés, noms de tables, fonctions, noms de colonnes et noms de fichiers sont complétés automatiquement).
- L'affichage de l'indicateur de progression de l'exĂ©cution de la requĂȘte est activĂ© par dĂ©faut dans le CLI.
Source : opennet.ru
