DuckDB
DuckDB — это встраиваемая реляционная система управления базами данных (СУБД), ориентированная на выполнение аналитических запросов (OLAP) в процессах обработки данных. Разрабатывается как открытое программное обеспечение (Open Source) под лицензией MIT. Главной особенностью DuckDB является колоночное хранение данных и движок, оптимизированный для сложных OLAP-запросов (агрегации, соединения больших таблиц, оконные функции), при этом она не требует установки отдельного сервера и работает внутри приложения.
История и контекст
DuckDB была создана в 2018—2019 годах в Центре интеллектуальных систем данных (CWI) в Нидерландах под руководством Ханнеса Мюлеисера и Марка Расвелда. Разработчики стремились создать аналог SQLite, но для аналитических нагрузок. SQLite идеально подходит для транзакционных (OLTP) задач, но неэффективен при анализе больших объёмов данных из-за строчного хранения и отсутствия продвинутого оптимизатора запросов. DuckDB проектировалась как колоночная база данных, способная работать с датасетами, значительно превышающими доступную оперативную память, за счёт поддержки внешних сортировок и хэшей.
Первый публичный релиз (v0.1) состоялся в 2019 году. За короткое время DuckDB завоевала популярность в сообществе разработчиков данных (Data Engineering, Data Science) благодаря лёгкости интеграции с языками Python, R, Julia, Node.js, а также низкому порогу входа. К 2024 году проект стабильно развивается, выпускаются новые версии, добавляющие расширения, поддержку форматов Parquet, CSV, JSON, а также возможности для работы с большими объёмами данных (шардинг, параллельное выполнение запросов).
Архитектура и устройство
DuckDB реализована как колоночная СУБД с векторным выполнением запросов. Векторная обработка означает, что ядро СУБД оперирует не одной строкой за раз, а пакетами (векторами) значений (типичный размер 1024 элемента), что существенно снижает накладные расходы на вызовы функций и повышает эффективность кэша процессора.
Ключевые компоненты архитектуры:
- Каталог: хранит метаданные о схемах, таблицах, типах данных, функциях. DuckDB поддерживает иерархию — один серверный процесс может работать с несколькими базами данных (каждая — отдельный файл каталога).
- Оптимизатор: строит план выполнения запроса на основе правил перезаписи (реордеринг соединений, продвижение предикатов, дедупликация и т.д.). Используется так называемый гибридный оптимизатор с критериями стоимости (cost-based) и эвристик.
- Исполнитель: выполняет план запроса в виде графа операторов (скан, фильтр, агрегация, сортировка, хэш-соединение). За счёт колоночного хранения и векторизации достигается скорость, сравнимая с крупными СУБД (ClickHouse, MonetDB).
- Хранилище: данные хранятся в колоночном формате с сжатием (используется метод словарного сжатия, дельта-кодирование, Run-Length Encoding). Поддерживается работа с данными вне ОЗУ (spill-to-disk) для больших таблиц.
Классификация и характеристики
DuckDB относится к классу встраиваемых OLAP-СУБД. Она не является клиент-серверной (хотя может работать и в таком режиме через расширения). Основные характеристики:
- Тип: колоночная, реляционная
- Модель запросов: SQL (с поддержкой оконных функций, табличных выражений, UNION, подзапросов, JOIN) и программный интерфейс (API) для языков (Python, R, C++, Go, Rust и др.)
- Транзакции: поддерживает ACID-транзакции (изоляция — уровень Serializable) в рамках одного процесса. Многопоточные транзакции — возможны в режиме параллельного чтения, но однопоточная запись (аналогично SQLite).
- Размер данных: не имеет жёстких ограничений на размер записи; поддерживает таблицы до сотен гигабайт, а при использовании внешнего хранилища (S3, Parquet) — до петабайт.
- Индексы: по умолчанию автоматически создаются только индексы для первичных ключей (реализованы как хэш-индексы). Для колоночной СУБД классические B-деревья менее актуальны, но можно создавать и пользовательские индексы для ускорения фильтрации по столбцам.
- Язык реализации: C++ (с биндингами для Python, R, Java, Node.js, Julia, Rust и др.)
- Лицензия: MIT (открытая)
Применение и экосистема
DuckDB нашла широкое применение в сценариях, где требуется быстрый и удобный анализ данных без настройки тяжёлой инфраструктуры:
- Анализ данных в научных исследованиях и Data Science: интеграция с pandas, dplyr, SQLite через коннекторы; позволяет выполнять сложные группировки и агрегации на таблицах размером в десятки гигабайт прямо из Jupyter Notebook.
- ETL-процессы (Extract, Transform, Load): DuckDB часто используется как лёгкий движок для преобразования данных после чтения из CSV, JSON, Parquet перед загрузкой в основное хранилище (например, Snowflake, BigQuery, ClickHouse).
- Обработка данных в памяти: поскольку DuckDB может работать с данными, загруженными в Pandas DataFrame или Apache Arrow, она эффективна для задач интерактивного анализа и визуализации.
- Бэкенды приложений: встраиваемая архитектура позволяет использовать DuckDB внутри desktop-приложений или веб-серверов (через Node.js или Python) для выполнения аналитических запросов к локальным файлам.
- Замена ClickHouse или Greenplum в малом и среднем масштабе: для датасетов до 100–500 ГБ DuckDB часто оказывается проще в развёртывании и быстрее в выполнении простых аналитических запросов.
Важные инструменты экосистемы:
- Расширения (Extensions): поддерживаются — HTTPFS (чтение/запись файлов по HTTP/HTTPS, в том числе S3), Parquet, Excel, SQLite, PostgreSQL (прямое подключение к удалённой базе), JSON. Есть также расширение для работы с Iceberg (формат таблиц для аналитических озер данных).
- MOTHERDUCK — облачный сервис (Managed Cloud) от создателей DuckDB, позволяющий выполнять запросы к данным, хранящимся в облачных хранилищах (S3, Azure Blob Storage, GCS), без необходимости разворачивания собственного кластера.
- dbt-duckdb — адаптер для платформы dbt (Data Build Tool), позволяющий использовать DuckDB как аналитическую базу данных для трансформаций.
Преимущества и ограничения
Достоинства DuckDB:
- Простота развёртывания: не требуется установка сервера — достаточно скопировать один исполняемый файл или установить пакет через pip/conda.
- Высокая скорость аналитики: за счёт колоночного хранения и векторизации запросы с группировкой, сортировкой и соединениями выполняются на порядки быстрее, чем в SQLite или PostgreSQL (для типичных аналитических запросов).
- Поддержка больших объёмов данных вне памяти: механизм spill-to-disk позволяет обрабатывать датасеты, превышающие доступную ОЗУ.
- Полная совместимость со стандартами SQL: поддерживается большинство возможностей SQL:2016, включая оконные функции, рекурсивные CTE, UNION, подзапросы, агрегации с фильтрами.
- Работа с форматами Big Data: нативная поддержка Parquet и CSV позволяет анализировать данные непосредственно из этих файлов, без загрузки в отдельную СУБД.
Недостатки и ограничения:
- Ограниченная поддержка многопользовательского режима: встроенная по умолчанию модель — однопользовательская; хотя есть поддержка параллельного чтения и записи, сценарий с десятками пользователей не является целевым.
- Отсутствие встроенных средств репликации и кластеризации: для отказоустойчивости требуется использовать внешние механизмы (например, хранение файлов на S3 с версионированием).
- Меньшая зрелость по сравнению с PostgreSQL/MariaDB: сообщество меньше, документация не всегда полная, некоторые функции могут содержать ошибки (баги).
- Ограниченная поддержка сложных типов данных: хотя массивы, JSON, геометрия (через расширения) поддерживаются, глубина работы со сложными структурами уступает специализированным решениям (PostgreSQL, H2).
Примеры использования
- Агрегация логов: пользователь загружает log-файлы в формате CSV (несколько гигабайт) и выполняет запрос — подсчитать количество запросов по часам, группам IP и статусам ответа — время выполнения 2–5 секунд, что недостижимо для SQLite.
- Финансовый анализ: аналитик использует DuckDB в Jupyter для соединения таблицы сделок (10 млн строк) с таблицей справочников (100 тыс. строк) — запрос с тремя соединениями выполняется за 3 секунды.
- Обработка потоковых данных: DuckDB может быть использована для периодического (каждые 5 минут) агрегирования данных, поступающих в виде новых Parquet-файлов, с последующей загрузкой в витрину на ClickHouse.
Интересные факты
- DuckDB получила название в честь семейства уток (одекс) — символа Цвикерского университета прикладных наук, где работает часть разработчиков; также есть отсылка к SQLite (утка — водоплавающая птица, которая уживается с лягушками).
- В бенчмарках между DuckDB, ClickHouse и Apache Spark на типовых аналитических запросах (TPC-H, TPC-DS) DuckDB часто показывает скорость в 5–10 раз выше Spark (в ущерб масштабируемости), при этом ресурсы потребляются минимальные.
- DuckDB использует собственный протокол клиент-сервер поверх обычного TCP (порт по умолчанию — 3306, как у MySQL), но встроенная интеграция с ODBC и JDBC является экспериментальной.
Источники
- H. Mühleisen, M. Raasveldt. DuckDB: an embeddable analytical database. Proceedings of the 2019 International Conference on Management of Data (SIGMOD). 2019.
- DuckDB Documentation (official). DuckDB: What is DuckDB? — https://duckdb.org/docs (режим доступа: свободный).
- Raasveldt, M., Mühleisen, H. (CWI). Vectorized execution in DuckDB. arXiv:2109.07392. 2021.
- DuckDB GitHub repository. License: MIT — https://github.com/duckdb/duckdb (режим доступа: свободный).
- TPC-H Benchmark Results for DuckDB. DuckDB Blog. 2023.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →