System Design Space
Граф знанийНастройки

Обновлено: 24 июня 2026 г. в 17:01

DuckDB: встроенная аналитическая СУБД и архитектура

средний

Встроенная аналитическая СУБД: работа внутри процесса, векторизованное выполнение, колоночное хранение, транзакции, Parquet/CSV-интеграции и локальные файловые конвейеры.

DuckDB полезен тем, что ломает привычку сразу поднимать отдельный аналитический кластер. Иногда правильный ход — выполнить аналитику прямо рядом с кодом и файлами.

В инженерной практике эта глава помогает увидеть, когда встроенная аналитика рядом с приложением, локальной средой разработки или файловым конвейером быстрее и проще централизованной инфраструктуры.

На интервью и в архитектурных обсуждениях она хорошо работает как пример зрелого ограничения: DuckDB ускоряет анализ и эксперименты, но не заменяет распределённую аналитическую платформу.

Практическая польза главы

Граница встроенной аналитики

Используйте DuckDB там, где нужна локальная аналитика рядом с приложением или рабочей средой без отдельного кластера.

Файл-ориентированные процессы

Проектируйте пайплайны на Parquet/CSV с минимальным копированием данных и прозрачной воспроизводимостью.

Переход в прод-контур

Заранее определяйте, когда локальная аналитика должна перейти в общее аналитическое хранилище.

Аргументация на интервью

Показывайте DuckDB как инструмент быстрого анализа, а не как универсальную замену распределённой аналитики.

Рамка выбора и редакторский фокус

Фокус главы

встроенной аналитике, локальных файловых конвейерах и границах DuckDB

Профиль нагрузки

Начинайте с специализированного запроса: аналитика, поиск, временные ряды, графовые обходы, векторное извлечение или мониторинговые метрики.

Когда выбирать

Выбор оправдан, когда модель индекса или хранения напрямую совпадает с продуктовой задачей и разгружает источник истины.

Граница и риск

Опасность — превратить специализированный слой в универсальную БД и потерять границы консистентности, свежести и владения данными.

Связать дальше

Связывайте главу с источником транзакционных данных, конвейером данных, удержанием данных, компакцией и архитектурой слоя модели чтения.

Источник

Wikipedia: DuckDB

История проекта DuckDB и его позиционирование как встроенной аналитической СУБД.

Открыть статью

Официальный сайт

DuckDB

Официальная документация, релизы, SQL-функциональность и интеграции с экосистемой данных.

Открыть сайт

DuckDB — встроенная аналитическая СУБД с SQL-интерфейсом и векторизованным выполнением. Её берут там, где аналитика нужна рядом с данными — в приложении, ноутбуке, файловом конвейере поверх Parquet/CSV, — а поднимать ради этого отдельный серверный кластер дорого и незачем.

Под здесь понимаем движок, который живёт прямо в адресном пространстве приложения, скрипта или ноутбука — без сетевого перехода к серверу. DuckDB закрывает на локальных данных и сознательно не претендует на роль удалённой транзакционной СУБД: это разные задачи с разной ценой ошибки.

Архитектурно важны , , , , и ограничение на .

История и контекст

2019early releases

Публичный старт проекта

DuckDB выходит как открытый аналитический движок для приложений, ноутбуков и локальных сценариев без отдельного сервера.

13 февраля 2024v0.10.0

Подготовка к 1.0

Линия 0.10.x достраивает возможности языка запросов SQL и подтягивает производительность — закладка под стабильную ветку 1.x.

3 июня 2024v1.0.0

Стабильный мажорный релиз

Главный сигнал релиза 1.0 — обещание совместимости формата хранения: на него уже можно опираться в боевых сценариях, не опасаясь миграций при каждом обновлении.

9 сентября 2024v1.1.0

Развитие 1.x ветки

Продолжаются улучшения оптимизатора, SQL-функций и интеграций с аналитической экосистемой.

27 января 2026v1.4.4 (LTS)

Стабилизация линии LTS-релизов

Ветка релизов с длительной поддержкой (LTS) делает обновления предсказуемыми — это важно там, где цикл сопровождения растягивается на годы и переезжать на каждую новую версию нельзя.

Ключевые архитектурные элементы

Архитектура внутри процесса

DuckDB подключается как библиотека прямо в процесс приложения. Нет отдельного сервера СУБД и нет сетевого перехода между кодом и движком — но и масштабировать движок отдельно от приложения тоже нельзя.

Векторизованное выполнение SQL

Операторы обрабатывают данные пакетами, а не по одной строке — отсюда выигрыш на крупных аналитических сканах. Цена та же, что у любой колоночной аналитики: точечные обращения по ключу это не ускоряет.

Колоночное хранение и открытые форматы

Колоночная раскладка плюс прямое чтение Parquet/CSV/Arrow превращают DuckDB в SQL-слой поверх файлов озера данных — запрос идёт к файлам как есть, без предварительной загрузки в отдельное хранилище.

Транзакции и ограничения записи

Транзакции и журнал предзаписи на месте, но запись в файл базы данных рассчитана на один процесс. Если за обновление дёргают несколько процессов сразу — это уже не сценарий для DuckDB.

Модель выполнения и хранения

Здесь интерактивный разбор того, как DuckDB исполняет запрос: встраиваемый режим, векторизованное выполнение, устройство хранения, транзакционность и тот самый предел конкурентной записи, об который чаще всего и спотыкаются.

Модель выполнения и хранения DuckDB

DuckDB совмещает работу внутри процесса, векторизованное выполнение и колоночное хранение, поэтому закрывает аналитические сценарии без отдельного серверного кластера.

Почему DuckDB — это отдельный класс аналитической СУБД

  • Движок работает внутри процесса приложения, что снижает операционную нагрузку для локальной аналитики.
  • Векторизованное выполнение и колоночное хранение оптимизируют крупные аналитические сканы.
  • Есть транзакции, журнал WAL и контрольные точки, но конкурентная запись ориентирована на один процесс записи.
  • DuckDB напрямую работает с Parquet/CSV/Arrow и подходит для встроенной файловой аналитики.

Работа внутри процесса

DuckDB запускается как библиотека внутри приложения (Python/R/CLI/BI), без отдельного серверного процесса СУБД.

Ключевые элементы

Встроенная библиотекаОдин файл БД или памятьЛокальная и периферийная аналитика

Типичные сценарии

  • Аналитика в ноутбуках
  • Локальный BI
  • Обработка данных рядом с приложением

Пример

import duckdb
con = duckdb.connect('warehouse.duckdb')

Архитектура DuckDB по слоям

Схема собирает общий контур в одну картинку: клиентское встраивание, слой языка запросов SQL и оптимизатор, конвейер векторизованного выполнения, подсистему хранения и точки интеграции с экосистемой.

Клиенты и встраивание
Python/R/JS APICLI и shellBI/ноутбукиВстраивание в процесс
переход слоя
SQL и оптимизатор
Разбор и привязкаЛогический оптимизаторФизический планФильтры и соединения
переход слоя
Векторизованное выполнение
DataChunk + VectorКонвейерные операторыПараллельные сканыSIMD-пакеты
переход слоя
Хранение и ввод-вывод
Группы строкСжатиеWAL + контрольные точкиЧтение Parquet/CSV/JSON
переход слоя
Транзакции и надёжность
MVCCИзоляция снимкаОдин процесс записиТранзакции ACID
переход слоя
Расширения и экосистема
Фреймворк расширенийArrow/Pandas/PolarsUDF/UDAFLakehouse-сценарии

Системная роль

Встроенная аналитикаБез отдельного сервераЛокальные ELT-процессы

Профиль производительности

Векторизованное выполнениеКолоночные сканыБыстрая работа с Parquet

Компромиссы эксплуатации

Один процесс записиНе распределённая OLTP-СУБДСильна в аналитике

Пути записи и чтения через компоненты

Диаграмма объединяет путь записи и путь чтения: от SQL-команды клиента через оптимизатор и векторизованное выполнение до сохранения данных или возврата аналитического результата.

Пути записи и чтения

Интерактивный разбор прохождения DuckDB-команд через планирование SQL, векторизованное выполнение и слой хранения.

1
Команда клиента
INSERT COPY CTAS
2
Разбор и оптимизация
logical -> physical
3
Векторизованное выполнение
DataChunk конвейер
4
Транзакция и WAL
ACID + контрольная точка
5
Колоночное хранение
группы строк
Путь записи: команда проходит разбор и оптимизацию, выполняется пакетами, фиксируется через журнал WAL и попадает в колоночное хранение.

Путь записи

  1. DuckDB оптимизирован под массовую запись (`COPY`, пакетный `INSERT`, `CTAS`) в одном процессе.
  2. План записи проходит оптимизацию и исполняется векторизованными операторами пакетами.
  3. Транзакции, журнал WAL и `CHECKPOINT` обеспечивают сохранность в постоянном режиме хранения.
  4. Схемы с индексами и ограничениями повышают целостность, но могут замедлить массовую загрузку.

Когда выбирать DuckDB

Хорошо подходит

  • Встроенная аналитика в приложении, ноутбуке и локальных инструментах бизнес-аналитики (BI).
  • Локальные конвейеры извлечения, загрузки и преобразования поверх Parquet/CSV/JSON, когда поднимать отдельный кластер ради этого незачем.
  • Проектирование признаков и разовая аналитика рядом с Python/Pandas/Polars — без выгрузки данных во внешнюю СУБД.
  • Офлайн- и периферийные сценарии: подкупает простая доставка одним артефактом и низкая операционная нагрузка.

Стоит избегать

  • Многопользовательский транзакционный сервис с интенсивной записью из разных процессов или узлов — ограничение на один процесс записи здесь становится стеной.
  • Распределённый кластер с автоматическим переключением на резерв и горизонтальным масштабированием хранилища: этого DuckDB не даёт по архитектуре.
  • Системы, завязанные на блокировки уровня строк и длинные конкурентные транзакции.
  • Множество независимых сервисов, которым нужен общий постоянный удалённый адрес экземпляра СУБД.

Практика: DDL и DML

Ниже примеры SQL-операций в DuckDB: DDL для схемы и индексов, DML для приёма данных, преобразований и аналитических запросов.

Примеры DDL и DML в DuckDB

DDL описывает схему и индексы, DML управляет загрузкой и аналитическими запросами.

DuckDB использует классический SQL DDL: таблицы, ограничения, индексы, схемы и ATTACH для работы с несколькими файлами БД.

Создание аналитических таблиц и ограничений

CREATE TABLE

DDL задаёт структуру и базовые правила целостности данных.

CREATE TABLE users (
  user_id BIGINT PRIMARY KEY,
  plan VARCHAR,
  created_at TIMESTAMP
);

CREATE TABLE events (
  event_id BIGINT,
  user_id BIGINT,
  event_type VARCHAR,
  event_ts TIMESTAMP,
  payload JSON,
  FOREIGN KEY (user_id) REFERENCES users(user_id)
);

Индекс для селективных фильтров

CREATE INDEX

Индексы в DuckDB полезны для точечных и селективных условий, но не всегда нужны для крупных аналитических сканов.

CREATE INDEX idx_events_user_ts
ON events (user_id, event_ts);

ATTACH и создание витрины в отдельной схеме

ATTACH + CREATE SCHEMA/TABLE

Можно держать сырые данные и витрины в отдельных подключённых БД и схемах.

ATTACH 'warehouse.duckdb' AS wh;
USE wh;

CREATE SCHEMA IF NOT EXISTS mart;

CREATE TABLE mart.daily_events AS
SELECT DATE(event_ts) AS dt, event_type, count(*) AS cnt
FROM events
GROUP BY 1, 2;

Связанные главы

Чтобы отмечать прохождение, включи трекинг в Настройки