De release van de database DuckDB 0.6.0 is beschikbaar, die eigenschappen van SQLite combineert, zoals compactheid, de mogelijkheid om aan te sluiten als een ingebouwde bibliotheek, het opslaan van de database in één bestand en een gebruiksvriendelijke CLI-interface, met middelen en optimalisaties voor het uitvoeren van analytische queries die een aanzienlijk deel van de opgeslagen gegevens bestrijken, bijvoorbeeld het aggregeren van alle inhoud van tabellen of het samenvoegen van verschillende grote tabellen. De code van het project wordt verspreid onder de MIT-licentie. De ontwikkeling bevindt zich momenteel in de fase van het creëren van experimentele releases, aangezien het opslagformaat nog niet gestabiliseerd is en van versie tot versie verandert.
DuckDB biedt een uitgebreide SQL-taal die extra mogelijkheden bevat voor het verwerken van zeer complexe en langdurige queries. Ondersteuning voor complexe types (arrays, structuren, unions) en de mogelijkheid om willekeurige en geneste correlatie-subqueries uit te voeren, zijn inbegrepen. Meerdere queries kunnen gelijktijdig worden uitgevoerd, en queries kunnen direct vanuit bestanden in CSV- en Parquet-formaat worden uitgevoerd. Er is ook de mogelijkheid om te importeren vanuit PostgreSQL-databases.
Naast de shell-code van SQLite gebruikt het project een apart gemaakte parser van PostgreSQL, de Date Math-component van MonetDB, zijn eigen implementatie van vensterfuncties (op basis van het Segment Tree Aggregation-algoritme), een regex-verwerker gebaseerd op de RE2-bibliotheek, eigen query-optimalisatoren, een MVCC-mechanisme voor het beheren van gelijktijdige taakuitvoering (Multi-Version Concurrency Control), en een gevectoriseerde query-executiemotor op basis van het Hyper-Pipelining Query Execution-algoritme, waardoor grote sets waarden in één operatie efficiënt kunnen worden verwerkt.
Onder de veranderingen in de nieuwe release:
- De werkzaamheden aan de verbetering van het opslagformaat zijn voortgezet. Een optimistische schrijfmodus naar schijf is geïmplementeerd, waarbij een grote dataset in één transactie wordt geladen, de gegevens gecomprimeerd en in een stroom op de databasebestand worden geschreven, zonder te wachten op de voltooiing van de bevestiging van de transactie met de COMMIT-opdracht. Op het moment dat de COMMIT-opdracht wordt gegeven, zijn de gegevens al op de schijf geschreven, en bij een ROLLBACK worden ze verworpen. Eerder werden gegevens volledig in het geheugen opgeslagen voordat ze bij een commit op de schijf werden vastgelegd.
- Ondersteuning voor parallelle gegevensbelasting in afzonderlijke tabellen is toegevoegd, wat de laadsnelheid op multicore systemen aanzienlijk verhoogt. In de vorige release kostte het laden van een database met 150 miljoen rijen op een 10-core CPU 91 seconden, terwijl in de nieuwe versie deze operatie in 17 seconden wordt uitgevoerd. Er zijn twee modi voor parallelle belasting voorzien: met en zonder het behoud van de volgorde van records.
- Voor de compressie van gegevens wordt de FSST-algoritme (Fast Static Symbol Table) gebruikt, dat gegevens binnen strings verpakt met behulp van een gedeeld woordenboek van typische overeenkomsten. Het gebruik van het nieuwe algoritme heeft de grootte van de test-database verminderd van 761 MB naar 251 MB.
- Voor de compressie van zwevende getallen (DOUBLE en FLOAT) zijn de Chimp- en Patas-algoritmen voorgesteld. Vergeleken met het eerder gebruikte Gorillas-algoritme biedt Chimp een hoger compressieniveau en snellere decompressie. Het Patas-algoritme presteert minder goed in compressie dan Chimp, maar is aanzienlijk sneller in decompressie, wat bijna vergelijkbaar is met het lezen van ongecomprimeerde gegevens.
- Er is een experimentele mogelijkheid toegevoegd om gegevens vanuit CSV-bestanden in meerdere parallelle stromen te laden (SET experimental_parallel_csv=true), wat de laadtijd van grote CSV-bestanden aanzienlijk verkort. Bijvoorbeeld, met deze optie is de laadtijd van een CSV-bestand van 720 MB verminderd van 3,5 naar 0,6 seconde.
- Er is een mogelijkheid gerealiseerd voor parallelle uitvoering van het maken en beheren van indexen. Bijvoorbeeld, de uitvoering van de CREATE INDEX-operatie voor een kolom met 16 miljoen records is verminderd van 5,92 naar 1,38 seconde.
- Parallellisatie van aggregatieoperaties is gegarandeerd in queries met de expressie 'COUNT(DISTINCT col)'.
- SQL heeft ondersteuning toegevoegd voor het UNION-type, dat het mogelijk maakt om meerdere types aan één element te koppelen (bijvoorbeeld, 'UNION(num INT, error VARCHAR)').
- In SQL is de mogelijkheid toegevoegd om queries te vormen die beginnen met het woord 'FROM' in plaats van 'SELECT'. In dit geval wordt подразумеет dat de query begint met 'SELECT *'.
- In SQL is ondersteuning toegevoegd voor de expressie 'COLUMNS', die het mogelijk maakt om een operatie op meerdere kolommen uit te voeren zonder de expressie te dupliceren. Bijvoorbeeld, 'SELECT MIN(COLUMNS(*)) from obs;' zal de MIN-functie uitvoeren voor elke kolom in de tabel obs, en 'SELECT COLUMNS(‘val[0-9]+’) from obs;' voor kolommen met de naam die bestaat uit 'val' en cijfers.
- Ondersteuning is toegevoegd voor operaties op lijsten, bijvoorbeeld 'SELECT [x + 1 for x in [1, 2, 3]] AS l;'.
- Het geheugenverbruik is geoptimaliseerd. Standaard wordt op het Linux-platform de jemalloc-bibliotheek gebruikt voor geheugenbeheer. De prestaties van hash-joins zijn aanzienlijk verbeterd bij beperkte geheugenomvang.
- In de commandoregelinterface is de uitvoermodus '.mode duckbox' toegevoegd, die gemiddelde kolommen weglaat rekening houdend met de breedte van het terminalvenster (geschikt voor een snelle visuele inschatting van de resultaten van queries met een groot aantal kolommen, zoals 'SELECT * FROM tbl', die normaal gesproken over meerdere regels uitrekken). Met de parameter '.maxrows X' kan ook het aantal weergegeven rijen worden beperkt.
- In de CLI is autocompletion geïmplementeerd met inachtneming van de context (autocompletion van invoer voor sleutelwoorden, tabelnamen, functies, kolomnamen en bestandsnamen).
- In de CLI is standaard de weergave van een voortgangsindicator voor het uitvoeren van een query ingeschakeld.
Bron: opennet.ru
