Bylo vydáno vydání databázového systému DuckDB 1.4.0, zaměřeného na provádění analytických dotazů a konceptuálně připomínajícího SQLite. DuckDB kombinuje vlastnosti SQLite, jako je kompaktnost, připojení ve formě vestavěné knihovny, ukládání databází do jediného souboru a CLI rozhraní, s možnostmi a optimalizacemi pro provádění analytických dotazů pokrývajících významnou část uložených dat, například provádějící agregaci celého obsahu tabulek nebo sloučení několika velkých tabulek. Kód projektu je napsán v jazyce C++ a šíří se pod licencí MIT.
DuckDB poskytuje rozšířený dialekt jazyka SQL, který zahrnuje další možnosti pro zpracování velmi složitých a dlouho běžících dotazů. Je možné používat složité typy (pole, struktury, unie), jakož i vykonávat libovolné a vnořené korelované poddotazy. Podporuje se současné provádění několika dotazů a možnost spouštět dotazy přímo z souborů ve formátech CSV a Parquet. Je dostupná podpora importu z databázového systému PostgreSQL.
Projekt využívá shell ze SQLite, parser z PostgreSQL, komponentu Date Math z MonetDB, vlastní implementaci okenních funkcí (na základě algoritmu Segment Tree Aggregation), zpracovatele regulárních výrazů založeného na knihovně RE2, vlastní optimalizátor dotazů, MVCC mechanismus správy současného vykonávání úloh (Multi-Version Concurrency Control) a vektorový engine pro vykonávání dotazů na základě algoritmu Hyper-Pipelining Query Execution, který umožňuje zpracovávat velké sady hodnot v jednom kroku.
V nové verzi:
- Byla přidána podpora pro ukládání souborů databází v zašifrované podobě. K šifrování se používá algoritmus AES-256 v režimu GCM. Šifruje se nejen hlavní soubor s daty, ale také WAL protokoly a dočasné soubory. Klíče pro šifrování databáze se zadávají příkazem ATTACH prostřednictvím parametru ENCRYPTION_KEY. ATTACH 'encrypted.db' AS enc_db (ENCRYPTION_KEY 'quack_quack');
- Byla přidána podpora příkazu „MERGE INTO“, který může být použit jako alternativa k výrazu „INSERT ... ON CONFLICT“, nevyžaduje primární klíč a pracuje s libovolnými podmínkami sloučení. Příkaz „MERGE INTO“ umožňuje vytvářet podmínková SQL výrazy, které kombinují v jednom výrazu operace INSERT, UPDATE a DELETE. Například pomocí MERGE lze provést sloučení dvou tabulek, vložením chybějících záznamů a aktualizací existujících. WITH deletes(item_id, delete_threshold) AS (VALUES (10, 3000)) MERGE INTO Stock USING deletes USING (item_id) WHEN MATCHED AND balance < delete_threshold THEN DELETE RETURNING merge_action, *;
- Kromě toho byla přidána podpora zápisových operací pro tabulky ve formátu Apache Iceberg (dříve byla podporována pouze čtení), což umožňuje přesun dat z Iceberg do DuckDB a naopak.
- Do klienta příkazového řádku byl přidán ukazatel pokroku vykonávání operace s předpovědí zbývajícího času do dokončení.
- Byla přidána okna funkce „FILL“, kterou lze použít k interpolaci chybějících hodnot v seřazených oknech. FROM (VALUES (1, 1), (2, NULL), (3, 42)) t(c1, c2) SELECT fill(c2) OVER (ORDER BY c1) f; 1 21 42
- Byl realizován doplněk Teradata Connector pro připojení k databázím Teradata. Doplněk umožňuje manipulaci s tabulkami, provádění dotazů a spouštění SQL příkazů přímo v Teradata s využitím DuckDB.
- Byla přidána podpora pro uložení stavu (checkpoint) tabulek uložených v paměti, což umožnilo implementaci podpory komprese. Dále při uložení stavu probíhá úklid odstraněných řádků a uvolnění místa po operacích odstranění. ATTACH ‘:memory:’ AS memory_compressed (COMPRESS);
- Bylo navrženo několik optimalizací výkonu: Implementace třídění byla převedena na použití algoritmu k-cestného sloučení (k-way merge sort), což snižuje pohyb dat. Obecné tabulkové výrazy (Common Table Expression, CTE) jsou nyní standardně materializovány.
Zdroj: opennet.ru
