Objavljen je izdanak DBMS-a DuckDB 0.6.0, koji kombinira svojstva SQLite, kao što su kompaktnost, mogućnost povezivanja kao ugrađene biblioteke, pohrana baze podataka u jednom datoteci i praktični CLI sučelje, s alatima i optimizacijama za izvršavanje analitičkih upita koji pokrivaju značajan dio pohranjenih podataka, na primjer, koji provode agregaciju cijelog sadržaja tablica ili spajanje više velikih tablica. Izvorni kod projekta distribuira se pod MIT licencom. Razvoj je trenutno u fazi stvaranja eksperimentalnih izdanja, budući da format spremišta još nije stabiliziran i mijenja se od verzije do verzije.
DuckDB nudi prošireni dijalekt SQL jezika, uključujući dodatne mogućnosti za obradu vrlo složenih i dugotrajnih upita. Podržava upotrebu složenih tipova (nizovi, strukture, unije) i mogućnost izvršavanja proizvoljnih i ugniježdenih koreliranih podupita. Podržava istovremeno izvršavanje više upita, izvođenje upita izravno iz datoteka u CSV i Parquet formatu. Postoji mogućnost uvoza iz PostgreSQL Sustava za upravljanje bazama podataka.
Osim koda ljuske iz SQLite-a, projekt koristi parser izdvojen u posebnoj biblioteci iz PostgreSQL-a, komponentu Date Math iz MonetDB-a, vlastitu implementaciju prozorskih funkcija (na temelju algoritma Segment Tree Aggregation), obrada regularnih izraza temeljenih na biblioteci RE2, vlastiti optimizator upita, MVCC mehanizam upravljanja istovremenim izvršavanjem zadataka (Multi-Version Concurrency Control), kao i vektorizirani motor za izvođenje upita na temelju algoritma Hyper-Pipelining Query Execution, koji omogućuje u jednoj operaciji da istovremeno obradi velike skupove vrijednosti.
Među promjenama u novom izdanju:
- Nastavljeni su radovi na usavršavanju formata pohrane. Implementiran je optimistični način zapisivanja na disk, pri čemu se, pri učitavanju velikog skupa podataka u jednoj transakciji, podaci komprimiraju i u strujnom načinu zapisuju u datoteku s bazom podataka, ne čekajući završetak potvrde transakcije naredbom COMMIT. Prilikom primanja naredbe COMMIT, podaci su već zapisani na disk, a prilikom izvršenja ROLLBACK — odbacuje se. Ranije su se podaci prvo potpuno čuvali u memoriji, a prilikom komitovanja pohranjivali na disk.
- Dodana je podrška za paralelno učitavanje podataka u odvojene tablice, što značajno povećava brzinu učitavanja na višejezgrenim sustavima. Na primjer, u prethodnom izdanju učitavanje baze podataka s 150 milijuna redaka na 10-jezgrenom CPU-u trajalo je 91 sekundu, dok se u novoj verziji ta operacija izvršava za 17 sekundi. Predviđena su dva načina paralelnog učitavanja — sa očuvanjem redoslijeda zapisa i bez očuvanja redoslijeda.
- Za komprimiranje podataka korišten je algoritam FSST (Fast Static Symbol Table), koji omogućava pakiranje podataka unutar nizova, koristeći zajednički rječnik tipičnih podudaranja. Primjena novog algoritma omogućila je smanjenje veličine testne baze podataka s 761MB na 251MB.
- Za kompresiju brojeva s pomičnom zarezom (DOUBLE i FLOAT) predloženi su algoritmi Chimp i Patas. U usporedbi s ranije korištenim algoritmom Gorillas, Chimp osigurava viši nivo kompresije i bržu dekompresiju. Algoritam Patas zaostaje u stupnju kompresije za Chimpom, ali je znatno brži po brzini dekompresije, koja skoro ne razlikuje od čitanja nekomprimiranih podataka.
- Dodana je eksperimentalna funkcionalnost za učitavanje podataka iz CSV datoteka u nekoliko paralelnih tokova (SET experimental_parallel_csv=true), što značajno skraćuje vrijeme učitavanja velikih CSV datoteka. Na primjer, pri uključivanju opcije vrijeme učitavanja CSV datoteke od 720 MB smanjeno je s 3.5 na 0.6 sekundi.
- Implementirana je mogućnost paralelnog izvršavanja operacija kreiranja i upravljanja indeksima. Na primjer, izvršavanje operacije CREATE INDEX za stupac sa 16 milijuna zapisa smanjeno je s 5.92 na 1.38 sekundi.
- Osigurano je paralelno izvršavanje agregacijskih operacija u upitima koji sadrže izraz 'COUNT(DISTINCT col)'.
- U SQL-u je dodana podrška za tip UNION, koji omogućuje vezanje više tipova na jedan element (na primjer, 'UNION(num INT, error VARCHAR)')?
- U SQL-u je omogućeno formiranje upita koji počinju riječju 'FROM' umjesto 'SELECT'. U ovom slučaju podrazumijeva se da upit počinje s 'SELECT *'.
- U SQL-u je dodana podrška za izraz 'COLUMNS', koji omogućuje izvođenje operacije na više stupaca bez ponavljanja izraza. Na primjer, 'SELECT MIN(COLUMNS(*)) from obs;' će izvršiti funkciju MIN za svaki stupac u tablici obs, a 'SELECT COLUMNS(‘val[0-9]+’) from obs;' za stupce čije ime se sastoji od 'val' i cifara.
- Dodana je podrška za operacije nad listama, na primjer, 'SELECT [x + 1 for x in [1, 2, 3]] AS l;'.
- Provedena je optimizacija potrošnje memorije. Po defaultu na Linux platformi za upravljanje memorijom koristi se biblioteka jemalloc. Znatno je poboljšana učinkovitost operacija spajanja heševa pri ograničenoj količini memorije.
- U komandnoj liniji dodat je režim ispisa '.mode duckbox', koji odbacuje srednje stupce uzimajući u obzir širinu terminalnog prozora (prikladno za brzo vizualno ocjenjivanje rezultata upita s velikim brojem stupaca, kao što je 'SELECT * FROM tbl', koji se u običnom režimu raspoređuju na nekoliko redaka). Uz pomoć parametra '.maxrows X' dodatno se može ograničiti i broj ispisanih redaka.
- U CLI-u je osigurano automatsko dovršavanje unosa s obzirom na kontekst (dopunjuje unos ključnih riječi, imena tablica, funkcija, imena stupaca i imena datoteka).
- U CLI-u je prema zadanim postavkama uključeno prikazivanje pokazatelja napretka izvršavanja upita.
Izvor: opennet.ru
