Megjelent a DuckDB 0.6.0 adatbázis-kezelő rendszer, amely ötvözi az SQLite néhány jellemzőjét, mint például a kompakt méret, a beágyazott könyvtár formájában történő csatlakozás, az adatbázis egy fájlban való tárolása, valamint a kényelmes CLI felület, és analitikai lekérdezések végrehajtásának eszközei és optimalizálásai, amelyek a tárolt adatok jelentős részét lefedik, például az összes táblázat tartalmának aggregálását vagy több nagy táblázat egyesítését. A projekt kódja MIT licenc alatt terjesztendő. A fejlesztés jelenleg kísérleti kiadások szakaszában van, mivel a tárolási formátum még nem stabilizálódott, és verzióról verzióra változik.
A DuckDB egy kiterjesztett SQL nyelvdialektust kínál, amely további lehetőségeket tartalmaz nagyon összetett és hosszan futó lekérdezések feldolgozására. Támogatja a bonyolult típusok (tömbök, struktúrák, egyesítések) használatát, valamint a tetszőleges és beágyazott korrelált lekérdezések végrehajtásának lehetőségét. Támogatott a párhuzamos lekérdezés-végrehajtás, a lekérdezések közvetlen végrehajtása CSV és Parquet formátumú fájlokból, és van lehetőség importálásra PostgreSQL adatbázisokból.
A projekt az SQLite-ból származó shell kód mellett egy külön könyvtárba helyezett PostgreSQL parser-t, a MonetDB-ből származó Date Math komponenst, saját megvalósítású ablakos funkciókat (a Segment Tree Aggregation algoritmus alapján), az RE2 könyvtáron alapuló reguláris kifejezések feldolgozóját, egyedi lekérdezés-optimalizálót, egy MVCC mechanizmust a párhuzamos végrehajtás irányítására (Multi-Version Concurrency Control), valamint egy hyper-pipelining lekérdezés-végrehajtó algoritmusra épülő vektorizált végrehajtó motort alkalmaz, amely lehetővé teszi, hogy egy művelet során nagyméretű értékhalmazokat egyszerre kezeljen.
A legújabb verzióban bekövetkezett változások:
- Folyamatban van a tárolási formátum tökéletesítése. Megvalósították az optimista disk írási módot, amely lehetővé teszi, hogy egy nagy adathalmaz egy tranzakcióban történő betöltésekor az adatok tömörítve és folyamatosan kerülnek beírásra az adatbázis fájlba, anélkül, hogy várni kellene a tranzakció megerősítési végrehajtására a COMMIT parancs által. A COMMIT parancs kiadása során az adatok már a lemezen találhatóak, míg a ROLLBACK végrehajtásakor eldobásra kerülnek. Korábban az adatokat először teljesen a memóriában tárolták, és a commit során írták a lemezre.
- Hozzáadták a párhuzamos adatbetöltés támogatását külön táblákra, ami jelentősen növeli a betöltési sebességet többmagos rendszereken. Például a korábbi kiadásban egy 150 millió soros adatbázis betöltése 10-magú CPU-val 91 másodpercig tartott, míg az új verzióban ez az eljárás 17 másodperc alatt végrehajtható. Két párhuzamos betöltési mód került bevezetésre — az adatok sorrendjének megőrzésével és anélkül.
- Az adatok tömörítésére az FSST (Fast Static Symbol Table) algoritmus került alkalmazásra, amely lehetővé teszi az adatok csomagolását a karakterláncokon belül, egy közös mintaszótár segítségével. Az új algoritmus alkalmazása lehetővé tette a teszt adatbázis méretének csökkentését 761 MB-ról 251 MB-ra.
- A lebegőpontos számok (DOUBLE és FLOAT) tömörítésére a Chimp és Patas algoritmusokat javasolták. A korábban használt Gorillas algoritmushoz képest a Chimp magasabb tömörítési szintet és gyorsabb kibővítést biztosít. A Patas algoritmus tömörítési arányban elmarad a Chimp mögött, de jelentősen gyorsabb a kibővítési sebesség, amely majdnem megegyezik a tömörítetlen adatok olvasási sebességével.
- Bevezetésre került egy kísérleti lehetőség, amely lehetővé teszi a CSV fájlokból történő adatok párhuzamos betöltését (SET experimental_parallel_csv=true), ami jelentősen csökkenti a nagy CSV fájlok betöltési idejét. Például az opció engedélyezésével a 720 MB méretű CSV fájl betöltési ideje 3,5 másodpercről 0,6 másodpercre csökkent.
- Megvalósításra került a párhuzamos indexkészítési és kezelési műveletek végrehajtása. Például az CREATE INDEX művelet egy 16 millió rekordot tartalmazó oszlop esetén az idő 5,92 másodpercről 1,38 másodpercre csökkent.
- Biztosítva lett a párhuzamos aggregálási műveletek végrehajtása azokban a lekérdezésekben, amelyek tartalmazzák a 'COUNT(DISTINCT col)' kifejezést.
- Az SQL-be bevezetésre került egy UNION típus, amely lehetővé teszi, hogy egy elemhez több típust kössünk (például 'UNION(num INT, error VARCHAR)').
- Az SQL-ben lehetőség nyílt olyan lekérdezések összeállítására, amelyek a 'FROM' szóval kezdődnek a 'SELECT' helyett. Ebben az esetben feltételezhető, hogy a lekérdezés a 'SELECT *'-tal kezdődik.
- Az SQL-be bevezetésre került a 'COLUMNS' kifejezés, amely lehetővé teszi, hogy egy műveletet több oszlopon hajtsunk végre anélkül, hogy megismételnénk a kifejezést. Például a 'SELECT MIN(COLUMNS(*)) from obs;' a MIN függvényt minden oszlopra alkalmazza az obs táblában, míg a 'SELECT COLUMNS(‘val[0-9]+’) from obs;' a 'val' és számokból álló nevű oszlopokra vonatkozik.
- Megvalósításra került a listákkal végzett műveletek támogatása, például 'SELECT [x + 1 for x in [1, 2, 3]] AS l;'.
- Optimalizálva lett a memóriafogyasztás. Alapértelmezetten Linux platformon a memória kezelésére a jemalloc könyvtárat használják. Jelentősen javult a hash egyesítési műveletek teljesítménye korlátozott memória esetén.
- A parancssori felületen bevezetésre került a '.mode duckbox' kimeneti mód, amely a terminálablak szélességére figyelemmel elhanyagolja a középső oszlopokat (alkalmas a nagy számú oszlopot tartalmazó lekérdezések, például a 'SELECT * FROM tbl' gyors, szemléletes értékelésére, amelyek normál módban több sorba rendeződnek). A '.maxrows X' paraméter segítségével további sorlimitálás is beállítható.
- A CLI-ben megvalósításra került a kontextus figyelembevételével történő automatikus kiegészítés (kiegészül a kulcsszavak, táblák, funkciók, oszlopok és fájlnevek bevitele).
- A CLI-ben alapértelmezés szerint megjelenik a lekérdezés előrehaladását jelző mutató.
Forrás: opennet.ru
