Опубликован выпуск СУБД DuckDB 1.2.0, ориентированной на выполнение аналитических запросов и концептуальной напоминающей SQLite. DuckDB сочетает такие свойства SQLite, как компактность, подключение в форме встраиваемой библиотеки, хранение БД в одном файле и CLI-интерфейс, с возможностями и оптимизациями для выполнения аналитических запросов, охватывающих значительную часть хранимых данных, например, выполняющих агрегирование всего содержимого таблиц или слияние нескольких больших таблиц. Код проекта написан на языке C++ и распространяется под лицензией MIT.
DuckDB предоставляет расширенный диалект языка SQL, включающий дополнительные возможности для обработки очень сложных и длительно выполняемых запросов. Возможно использование сложных типов (массивы, структуры, объединения), а также выполнение произвольных и вложенных коррелирующих подзапросов. Поддерживается одновременное выполнение нескольких запросов, выполнение запросов напрямую из файлов в форматах CSV и Parquet. Доступна поддержка импорта из СУБД PostgreSQL.
Проектом используется оболочка из SQLite, парсер из PostgreSQL, компонент Date Math из MonetDB, своя реализация оконных функций (на базе алгоритма Segment Tree Aggregation), обработчик регулярных выражений на основе библиотеки RE2, собственные оптимизатор запросов, MVCC-механизм управления одновременным выполнением заданий (Multi-Version Concurrency Control), а также векторизованный движок выполнения запросов на базе алгоритма Hyper-Pipelining Query Execution, позволяющий в одной операции разом обрабатывать большие наборы значений.
В новой версии:
- Реализована поддержка новых методов сжатия, которые не включены по умолчанию для сохранения совместимости БД-файлов с прошлыми версиями DuckDB. Для использования улучшенного формата БД-файлов предложена возможность привязки БД к номеру версии – при открытии файла при помощи параметра “STORAGE_VERSION” теперь можно задать минимально поддерживаемую версию БД (“ATTACH ‘file.db’ (STORAGE_VERSION ‘v1.2.0’);”). Для преобразования нового формата в старый можно использовать SQL-команду COPY, например: ATTACH ‘file1.db’; ATTACH ‘converted_file.db’ (STORAGE_VERSION ‘v1.0.0’); COPY FROM DATABASE file1 TO converted_file;
- Добавлена поддержка SQL-команды “ALTER TABLE … ADD PRIMARY KEY” для добавления первичного ключа к существующей таблице.
- Убрано ограничение, не позволявшее повторно добавлять идентификаторы, для которых присутствует индекс отслеживания уникальности, если данные идентификаторы были удалены в текущей транзакции. Например, нижеприведённый SQL-код теперь не приводит к ошибке: CREATE TABLE students (id INTEGER PRIMARY KEY, name VARCHAR); INSERT INTO students VALUES (1, ‘John Doe’); BEGIN; DELETE FROM students WHERE id = 1; INSERT INTO students VALUES (1, ‘Jane Doe’);
- Добавлена поддержка загрузки CSV-файлов в кодировках Latin-1 и UTF-16 (ранее поддерживалась только кодировка UTF-8). FROM read_csv(‘cities-latin-1.csv’, encoding = ‘latin-1’);
- Добавлена поддержка использования в CSV-файлах многобайтовых разделителей (до 4 байт), что позволяет указывать emoji в качестве разделителя столбцов. a🦆b hello🦆world FROM read_csv(‘example.dsv’, sep = ‘🦆’);
- По умолчанию включён строгий режим разбора файлов CSV (“strict_mode = true”), проверяющий соответствие форматирования спецификации RFC 4180. В строгом режиме допускается использование только одного символа для разделения строк, что приведёт к ошибке при попытке разбора файлов, для разделения строк в которых используется не только символ перевода строки, но и символ возврата каретки (“rn”).
- В парсере CSV задействован новый алгоритм определения новой строки, поддерживающий распараллеливание операций. Использование нового алгоритма ускорило разбор CSV примерно на 15%.
- Убрано ограничение на размер строки в CSV файлах (ранее строка не должна была превышать 8 МБ).
- При экспорте данных в формате Parquet реализована поддержка хэшей (словарей) и индексов на базе фильтра Блума. Реализован метод сжатия DELTA_BINARY_PACKED, позволяющий существенно сократить размер Parquet-файлов.
- В интерфейс командной строки добавлен безопасный режим,
активируемый при помощи опции “-safe” или команды “.safe_mode”. В данном режиме разрешается доступ только к изначально указанному файлу БД, а попытка открытия других файлов приведёт к выводу ошибки. - В интерфейсе командной строки улучшено автодополнение ввода. Код для автодополнения переведён на использование PEG (Parsing Expression Grammar).
- При выполнение команд в интерфейсе командной строки реализовано наглядное отображение больших чисел, например, при отображении числа
100000000, будет дополнительно приписано “(100 миллионов)”. - В SQL добавлена поддержка синтаксиса, при котором сокращённые наименования таблиц и выражений можно указывать до значений на которые они указывают (вместо использования синтаксиса “выражение AS наименование”): SELECT e1: some_long_and_winding_expression, e2: t2.a_column_name FROM t1: long_schema.some_long_table_name, t2: short_s.tbl;
- В команде “SELECT” реализована поддержка операции “RENAME” для переименования полей, выводимых при указании выражения “*”: SELECT * RENAME (col1 AS new_col1) FROM integers;
- В команде “SELECT” разрешено использование операций “LIKE” и “SIMILAR TO” при выводе через “*” : SELECT * LIKE ‘val%’ FROM key_val;
- Повышено качество генерации псевдослучайных чисел.
- Модернизирован оптимизатор запросов. Производительность при прохождении теста TPC-H SF100 увеличилась на 13%.
- Предложен новый Си-подобный API для разработки дополнений, который можно использовать, например, для создания новых агрегатных или табличных функций.
- Добавлена поддержка систем со стандартной Си-библиотекой Musl.