Dostupná verzia databázového systému DuckDB 0.6.0, ktorá kombinuje vlastnosti SQLite, ako je kompaktnosť, možnosť pripojenia vo forme zabudovanej knižnice, ukladanie databázy do jedného súboru a používateľsky prívetivé CLI rozhranie, s prostriedkami a optimalizáciami na vykonávanie analytických dopytov, pokrývajúcich značnú časť uložených dát, napríklad vykonávajúcich agregáciu celého obsahu tabuliek alebo zlučovanie niekoľkých veľkých tabuliek. Kód projektu sa šíri pod licenciou MIT. Vývoj je zatiaľ v štádiu formovania experimentálnych vydaní, pretože formát úložiska zatiaľ nie je stabilizovaný a mení sa od verzie k verzii.
V DuckDB je k dispozícii rozšírený dialekt jazyka SQL, ktorý zahŕňa dodatočné možnosti na spracovanie veľmi zložitých a časovo náročných dopytov. Podporuje sa použitie zložitých typov (polia, štruktúry, zjednotenia) a možnosť vykonávania ľubovoľných a vnorených korelovaných poddopytov. Podporuje sa súčasné vykonávanie viacerých dopytov, vykonanie dopytov priamo zo súborov vo formáte CSV a Parquet. Existuje možnosť importu z databázového systému PostgreSQL.
Okrem kódu shellu z SQLite projekt využíva vyčlenený parser z PostgreSQL, komponent Date Math z MonetDB, vlastnú implementáciu oknových funkcií (na základe algoritmu Segment Tree Aggregation), spracovateľ regulárnych výrazov na základe knižnice RE2, vlastný optimalizátor dopytov, MVCC mechanizmus správy súčasného vykonávania úloh (Multi-Version Concurrency Control) a tiež vektorový vykonávací motor dopytov na základe algoritmu Hyper-Pipelining Query Execution, ktorý umožňuje spracovávať veľké množstvá hodnôt v jednej operácii.
Medzi zmenami v novom vydaní:
- Pokračuje práca na vylepšení formátu skladovania. Bol implementovaný optimistický režim zápisu na disk, pri ktorom sa pri načítavaní veľkého množstva dát v jednej transakcii, dáta komprimujú a v streamovom režime zapisujú do súboru s databázou, bez čakania na dokončenie potvrdzovania transakcie príkazom COMMIT. Po prijatí príkazu COMMIT sú dáta už zapísané na disk, a pri vykonávaní ROLLBACK sa odmietajú. Predtým sa dáta najprv úplne uložili do pamäti a pri komite sa ukladali na disk.
- Pridaná podpora paralelného načítania dát do samostatných tabuliek, ktorá výrazne zvyšuje rýchlosť načítania na viacjadrových systémoch. Napríklad v predchádzajúcej verzii trvalo načítanie databázy s 150 miliónmi riadkov na 10-jadrovom CPU 91 sekúnd, zatiaľ čo v novej verzii sa táto operácia vykonáva za 17 sekúnd. Predpokladá sa dva režimy paralelného načítania - so zachovaním poradia záznamov a bez zachovania poradia.
- Na kompresiu dát bol použitý algoritmus FSST (Fast Static Symbol Table), ktorý umožňuje zabaliť dáta v rámci reťazcov pomocou spoločného slovníka typových zhod. Použitie nového algoritmu umožnilo znížiť veľkosť testovacej databázy z 761MB na 251MB.
- Na kompresiu čísel s plávajúcou čiarkou (DOUBLE a FLOAT) boli navrhnuté algoritmy Chimp a Patas. V porovnaní s predtým použitým algoritmom Gorillas, Chimp poskytuje vyššiu úroveň kompresie a rýchlejšie rozbalenie. Algoritmus Patas zaostáva v stupni kompresie za Chimpom, ale je výrazne rýchlejší pri rozbalení, ktoré sa skoro nelíši od čítania nezabalených dát.
- Pridaná experimentálna možnosť načítania údajov z CSV súborov vo viacerých paralelných prúdoch (SET experimental_parallel_csv=true), čo podstatne skráti čas načítania veľkých CSV súborov. Napríklad s povolenou voľbou sa čas načítania CSV súboru s veľkosťou 720 MB skrátil z 3,5 na 0,6 sekundy.
- Realizovaná možnosť paralelného vykonávania operácií vytvárania a správy indexov. Napríklad vykonanie operácie CREATE INDEX pre stĺpec s 16 miliónmi záznamov sa skrátilo z 5,92 na 1,38 sekundy.
- Zabezpečené rozdelenie operácií agregovania v dotazoch, ktoré obsahujú výraz „COUNT(DISTINCT col)“.
- V SQL sa pridala podpora typu UNION, ktorý umožňuje viazanie viacerých typov na jeden prvok (napríklad „UNION(num INT, error VARCHAR))“).
- V SQL sa poskytla možnosť vytvárania dotazov začínajúcich na slovo „FROM“ namiesto „SELECT“. V tomto prípade sa predpokladá, že dotaz začína na „SELECT *“.
- V SQL sa pridala podpora výrazu „COLUMNS“, ktorý umožňuje vykonať operáciu nad viacerými stĺpcami bez duplicity výrazu. Napríklad, „SELECT MIN(COLUMNS(*)) from obs;“ vykoná funkciu MIN pre každý stĺpec v tabuľke obs, a „SELECT COLUMNS(‘val[0-9]+’) from obs;“ pre stĺpce s menom pozostávajúcim z „val“ a čísel.
- Pridaná podpora operácií nad zoznamami, napríklad „SELECT [x + 1 for x in [1, 2, 3]] AS l;“.
- Prebehla optimalizácia spotreby pamäte. Predvolene na platforme Linux je na správu pamäte využívaná knižnica jemalloc. Výrazne sa zlepšil výkon operácií zlúčenia hashov pri obmedzenej veľkosti pamäte.
- Do rozhrania príkazového riadku bol pridaný režim výstupu „.mode duckbox“, ktorý ignoruje stredné stĺpce s ohľadom na šírku okna terminálu (vhodné na rýchlu vizuálnu hodnotenie výsledkov dotazov s veľkým počtom stĺpcov, ako je „SELECT * FROM tbl“, ktoré sa v bežnom režime rozťahujú na niekoľko riadkov). Pomocou parametra „.maxrows X“ je možné dodatočne obmedziť aj počet zobrazovaných riadkov.
- V CLI je zabezpečené automatické doplnenie vstupu s ohľadom na kontext (dopĺňa sa vstup kľúčových slov, názvov tabuliek, funkcií, názvov stĺpcov a názvov súborov).
- V CLI je predvolene zapnuté zobrazenie indikátora pokroku vykonania dotazu.
Zdroj: opennet.ru
