Представлен выпуск СУБД DuckDB 0.10.0, сочетающей такие свойства SQLite, как компактность, возможность подключения в форме встраиваемой библиотеки, хранение БД в одном файле и удобный CLI-интерфейс, со средствами и оптимизациями для выполнения аналитических запросов, охватывающих значительную часть хранимых данных, например, выполняющих агрегирование всего содержимого таблиц или слияние нескольких больших таблиц. Код проекта распространяется под лицензией MIT. Разработка пока находится на стадии формирования экспериментальных выпусков, так как формат хранилища пока не стабилизирован и меняется от версии к версии.
В DuckDB предоставляется расширенный диалект языка SQL, включающий дополнительные возможности для обработки очень сложных и длительно выполняемых запросов. Поддерживается использование сложных типов (массивы, структуры, объединения) и возможность выполнения произвольных и вложенных коррелирующих подзапросов. Поддерживается одновременное выполнение нескольких запросов, выполнение запросов напрямую из файлов в формате CSV и Parquet. Имеется возможность импорта из СУБД PostgreSQL.
Помимо кода оболочки из SQLite проектом используется вынесенный в отдельную библиотеку парсер из PostgreSQL, компонент Date Math из MonetDB, своя реализация оконных функций (на базе алгоритма Segment Tree Aggregation), обработчик регулярных выражений на основе библиотеки RE2, собственные оптимизатор запросов, MVCC-механизм управления одновременным выполнением заданий (Multi-Version Concurrency Control), а также векторизированный движок выполнения запросов на базе алгоритма Hyper-Pipelining Query Execution, позволяющий в одной операции разом обрабатывать большие наборы значений.
Среди изменений в новом выпуске:
- Значительно увеличена производительность разбора данных в формате CSV. Например, чтение CSV-файла с 11 млн строк в новой версии сократилось с 2.6 сек. до 1.15 сек., а выполнение операции “SELECT COUNT(*)” поверх CSV-файла с 1.8 сек. до 0.3 сек.
- Добавлена поддержка массивов фиксированного размера, которые напоминают списки, содержащие фиксированное число элементов (“CREATE TABLE vectors(v DOUBLE[3]);”).
- Добавлена поддержка подключения к СУБД MySQL, PostgreSQL и SQLite, что позволяет загружать в DuckDB данные из внешних СУБД и перемещать их между разными системами. Обращение к внешним БД осуществляется с использованием типовых таблиц. ATTACH ‘postgres:dbname=postgresscanner’ AS postgres; SELECT title, release_year, length FROM postgres.film LIMIT 5;
- Добавлена поддержка выражения “COMMENT ON” для сохранения комментария об объекте в БД.
- Добавлена поддержка выражения “COPY FROM DATABASE” для копирования всего содержимого из одной БД в другую.
- Добавлена поддержка модификатора “ALL” в выражениях EXCEPT и INTERSECT.
- Реализован тип
“UHUGEINT” (UINT128, беззнаковое 128-разрядное целое). - Добавлена экспериментальная поддержка шифрования Parquet.
- Добавлены новые функции parquet_kv_metadata, parquet_file_metadata, read_text, read_blob, list_reduce, list_where, list_zip, list_select, list_grade_up.
- Добавлен Secrets Manager для безопасного хранения учётных данных, таких как ключи для обращения к хранилищам Amazon S3, Google Cloud Storage, Cloudflare R2 и Azure Blob Storage. Учётные данные сохраняются в файле ~/.duckdb/stored_secrets.
- Добавлен менеджер временной памяти, координирующий работу операций, приводящих к использованию временных файлов из-за нехватки оперативной памяти, а также позволяющий определить лимиты на расходование оперативной памяти, после исчерпания которых включаются файлы подкачки.
- Добавлена поддержка адаптивного сжатия чисел с плавающей запятой (ALP, Adaptive Lossless Floating-Point Compression), позволяющая заметно сократить размер хранилища. Например, включение ALP позволило уменьшить размер БД с 489 MB до 184 MB, ценой увеличения времени прохождения теста с 0.316 до 0.434 сек.
- В CLI-интерфейсе по умолчанию включена поддержка многострочного редактирования, улучшена подсветка синтаксиса, улучшено наглядное выделение ошибок.
- При вызове функций по умолчанию отключено автоматическое неявное преобразование типов в VARCHAR (например, теперь не сработает вызов “substring(42, 1, 1)” вместо “substring(’42’, 1, 1)”) в пользу обязательного явного приведения типов.
- Разделены числовые и строковые литералы. Числовые литералы (INTEGER_LITERAL) могут неявно преобразовываться только в целочисленный тип, а строковые (STRING_LITERAL) могут неявно преобразовываться в любой другой тип.