A fost lansată versiunea 0.6.0 a SGBD-ului DuckDB, care îmbină proprietăți ale SQLite, cum ar fi compactitatea, capabilitatea de a se conecta sub formă de bibliotecă încorporată, stocarea bazei de date într-un singur fișier și o interfață CLI prietenoasă, cu instrumente și optimizări pentru executarea interogărilor analitice ce acoperă o mare parte din datele stocate, cum ar fi aggregarea întregului conținut al tabelelor sau fuziunea mai multor tabele mari. Codul proiectului este distribuit sub licența MIT. Dezvoltarea se află încă în stadiul formării versiunilor experimentale, deoarece formatul de stocare nu este încă stabilizat și se schimbă de la o versiune la alta.
DuckDB oferă un dialect extins al limbajului SQL, incluzând funcționalități suplimentare pentru procesarea interogărilor foarte complexe și de lungă durată. Este susținută utilizarea tipurilor complexe (array-uri, structuri, unii) și posibilitatea de a executa subinterogări arbitrare și încorporate corelate. Se permite execuția simultană a mai multor interogări, executarea interogărilor direct din fișiere în format CSV și Parquet. Există posibilitatea de import din SGBD PostgreSQL.
Pe lângă codul shell din SQLite, proiectul folosește un parser separat din PostgreSQL, componenta Date Math din MonetDB, o implementare proprie a funcțiilor de feronieră (bazată pe algoritmul Segment Tree Aggregation), un procesor de expresii regulate bazat pe biblioteca RE2, un optimizator de interogări propriu, un mecanism MVCC pentru gestionarea execuției simultane a sarcinilor (Controlul Concurenței pe Versiuni Multiple), precum și un motor vectorizat de execuție a interogărilor bazat pe algoritmul Hyper-Pipelining Query Execution, care permite procesarea rapidă a seturilor mari de valori într-o singură operațiune.
Printre modificările din noua versiune:
- Au continuat lucrările de îmbunătățire a formatului de stocare. A fost implementată o modalitate optimistă de scriere pe disc, în care, la încărcarea unui set mare de date într-o singură tranzacție, datele sunt comprimate și scrise în mod continuu în fișierul bazei de date, fără a aștepta finalizarea confirmării tranzacției cu comanda COMMIT. La primirea comenzii COMMIT, datele sunt deja scrise pe disc, iar la executarea ROLLBACK, acestea sunt respinse. Anterior, datele erau mai întâi complet salvate în memorie și, la comitere, erau salvate pe disc.
- A fost adăugată suportul pentru încărcarea paralelă a datelor în tabele separate, permițând o creștere semnificativă a vitezei de încărcare pe sistemele multicore. De exemplu, în versiunea anterioară, încărcarea unei baze de date cu 150 de milioane de linii pe un CPU cu 10 nuclee dura 91 de secunde, iar în noua versiune această operație se efectuează în 17 secunde. Sunt prevăzute două moduri de încărcare paralelă — cu păstrarea ordinii înregistrărilor și fără păstrarea ordinii.
- Pentru comprimarea datelor a fost utilizat algoritmul FSST (Fast Static Symbol Table), care permite ambalarea datelor în interiorul șirurilor, utilizând un dicționar comun de potriviri tipice. Aplicarea noului algoritm a permis reducerea dimensiunii bazei de date de test de la 761 MB la 251 MB.
- Pentru comprimarea numerelor cu virgulă mobilă (DOUBLE și FLOAT) au fost propuse algoritmii Chimp și Patas. Comparativ cu algoritmul Gorillas utilizat anterior, Chimp oferă un nivel mai înalt de comprimare și o decompresie mai rapidă. Algoritmul Patas este mai puțin eficient în ceea ce privește comprimarea comparativ cu Chimp, dar este semnificativ mai rapid la decompresie, aproape la fel de rapid ca citirea datelor necomprimate.
- A fost adăugată o funcționalitate experimentală care permite încărcarea datelor din fișiere CSV în mai multe firuri paralele (SET experimental_parallel_csv=true), ceea ce reduce semnificativ timpul de încărcare a fișierelor CSV mari. De exemplu, activarea opțiunii a redus timpul de încărcare a unui fișier CSV de 720 MB de la 3.5 la 0.6 secunde.
- A fost implementată posibilitatea de execuție paralelelă a operațiunilor de creare și gestionare a indicilor. De exemplu, timpul necesar pentru execuția operației CREATE INDEX pentru o coloană cu 16 milioane de înregistrări a fost redus de la 5.92 la 1.38 secunde.
- S-a asigurat paralelizarea operațiunilor de agregare în interogările care conțin expresia „COUNT(DISTINCT col)”.
- În SQL a fost adăugată suportul pentru tipul UNION, care permite legarea unui element cu mai multe tipuri (de exemplu, „UNION(num INT, error VARCHAR)”).
- În SQL a fost oferită posibilitatea de a forma interogări care încep cu cuvântul „FROM” în loc de „SELECT”. În acest caz, se subînțelege că interogarea începe cu „SELECT *”.
- În SQL a fost adăugată suportul pentru expresia „COLUMNS”, care permite executarea unei operații asupra mai multor coloane fără duplicarea expresiei. De exemplu, „SELECT MIN(COLUMNS(*)) from obs;” va executa funcția MIN pentru fiecare coloană din tabela obs, iar „SELECT COLUMNS(‘val[0-9]+’) from obs;” pentru coloanele cu nume format din „val” și cifre.
- A fost adăugat suportul pentru operațiile asupra listelor, de exemplu, „SELECT [x + 1 for x in [1, 2, 3]] AS l;”.
- A fost optimizat consumul de memorie. În mod implicit, pe platforma Linux, biblioteca jemalloc este utilizată pentru gestionarea memoriei. Performanța operațiunilor de unire a hash-urilor a fost semnificativ îmbunătățită la dimensiuni limitate ale memoriei.
- În interfața de linie de comandă a fost adăugat un mod de ieșire „.mode duckbox”, care elimină coloanele intermediare în funcție de lățimea ferestrei terminalului (potrivit pentru evaluarea rapidă a rezultatelor interogărilor cu un număr mare de coloane, cum ar fi „SELECT * FROM tbl”, care în mod normal se împart pe mai multe linii). Prin intermediul parametrului „.maxrows X” se poate limita suplimentar și numărul de rânduri afișate.
- În CLI, a fost asigurată completarea automată a introducerii în funcție de context (se completează introducerea cuvintele cheie, numele tabelelor, funcțiile, numele coloanelor și numele fișierelor).
- În CLI, activarea indicatorului de progres pentru execuția interogărilor este activată în mod implicit.
Sursa: opennet.ro
