Публикувано е издание на СУБД DuckDB 1.4.0, ориентирана за изпълнение на аналитични заявки, концептуално напомняща на SQLite. DuckDB съчетава свойства на SQLite, като компактност, интеграция под формата на вградена библиотека, съхранение на база данни в един файл и CLI интерфейс, с възможности и оптимизации за изпълнение на аналитични заявки, обхващащи значителна част от съхраняваните данни, например, изпълняващи агрегиране на съдържанието на таблици или сливане на няколко големи таблици. Кодът на проекта е написан на C++ и се разпространява под лиценз MIT.
DuckDB предоставя разширен диалект на SQL, включващ допълнителни възможности за обработка на много сложни и дълготрайни заявки. Възможно е използването на сложни типове (масиви, структури, съединения), а също така и изпълнение на произволни и вложени корелиращи подзаявки. Поддържа се паралелно изпълнение на няколко заявки, извършване на заявки директно от файлове във формати CSV и Parquet. Предоставя се поддръжка за импорт от СУБД PostgreSQL.
Проектът използва обвивка от SQLite, парсер от PostgreSQL, компонент за математически операции с дати от MonetDB, собствена реализация на прозоречни функции (на база алгоритъм Segment Tree Aggregation), обработчик на регулярни изрази, базиран на библиотеката RE2, собствен оптимизатор на заявки, механизъм MVCC за управление на паралелното изпълнение на задачи (Multi-Version Concurrency Control), както и векторизиран двигател за изпълнение на заявки на база алгоритъм Hyper-Pipelining Query Execution, позволяващ в една операция да се обработват големи набори от стойности.
В новата версия:
- Добавена е поддръжка за съхранение на файлове на базата данни вEncrypted, използвайки AES-256 алгоритъм в GCM режим. Шифрова се не само основният файл с данни, но и WAL логовете и времевите файлове. Ключовете за шифроване на базата данни се задават с командата ATTACH чрез параметъра ENCRYPTION_KEY. ATTACH 'encrypted.db' AS enc_db (ENCRYPTION_KEY 'quack_quack');
- Добавена е поддръжка на командата 'MERGE INTO', която може да се използва като алтернатива на израза 'INSERT … ON CONFLICT', не изискваща първичен ключ и работеща с произволни условия за сливане. Командата 'MERGE INTO' позволява създаването на условни SQL изрази, обединяващи операции INSERT, UPDATE и DELETE в един израз. Например, с помощта на MERGE може да се организира сливане на две таблици, като се вставят липсващи записи и се актуализират съществуващите. 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, *;
- В допълнение, за работа с таблици в формат Apache Iceberg, добавена е поддръжка на операции за запис (предишно поддържано само четене), което позволява прехвърляне на данни от Iceberg в DuckDB и обратно.
- В клиентската команда на конзолата е добавен индикатор за напредъка на операцията с прогноза за времето, останало до завършването.
- Добавена е прозоречната функция "FILL", която може да се използва за интерполация на липсващи стойности в подредени прозорци. FROM (VALUES (1, 1), (2, NULL), (3, 42)) t(c1, c2) SELECT fill(c2) OVER (ORDER BY c1) f; 1 21 42
- Реализиран е допълнителен Teradata Connector за свързване с бази данни Teradata. Допълнението позволява манипулиране на таблици, извършване на запитвания и изпълняване на SQL команди директно в Teradata, използвайки DuckDB.
- Добавена е поддръжка за фиксиране на състоянието (checkpoint) на таблиците, съхранявани в паметта, което е позволило реализирането на поддръжка на компресия. Освен това, при фиксиране на състоянието се извършва почистване на изтритите редове и освобождаване на място след операции по изтриване. ATTACH ‘:memory:’ AS memory_compressed (COMPRESS);
- Предложени са няколко оптимизации на производителността: реализацията на сортиране е преместена на алгоритъма за многопътно сливане (k-way merge sort), който намалява преместването на данни. Обобщените таблични изрази (Common Table Expression, CTE) сега се материализират по подразбиране.
Източник: opennet.ru
