Learning Platform
Глоссарий Troubleshooting
Урок 16.02 · 22 мин
Средний
motherduckclouddual-executionhybrid-query

MotherDuck: managed cloud DuckDB и dual execution

DuckDB по своей природе — embedded-движок: он живёт внутри вашего процесса, на вашей машине. Это его сила (нет сервера, нет сети, нет администрирования) и одновременно граница: данные лежат там, где запущен процесс, а делиться ими, шедулить запросы по расписанию или масштабировать compute за пределы одного ноутбука встроенными средствами нельзя.

MotherDuck — это коммерческий managed-сервис, который достраивает вокруг DuckDB облачную часть, не превращая DuckDB в обычную клиент-серверную СУБД. Ключевая идея — не «перенести DuckDB на сервер», а dual execution: один и тот же запрос может частично исполниться у вас локально, а частично — в облаке, и движок сам решает, как разделить работу, чтобы данные двигались минимально. В этом уроке разберём, что именно MotherDuck добавляет к DuckDB, как устроен dual execution и когда он реально ускоряет запросы.


Что MotherDuck добавляет к DuckDB

MotherDuck не форк DuckDB и не другой движок. Это тот же DuckDB, обёрнутый в облачную инфраструктуру. Подключение выглядит как ещё одна база, которую вы присоединяете:

-- Локальный DuckDB присоединяет облачный аккаунт MotherDuck
ATTACH 'md:';

-- Теперь видны облачные базы рядом с локальными
SHOW DATABASES;
-- database_name
-- ------------
-- memory        -- локальная in-memory
-- my_cloud_db   -- база в облаке MotherDuck
-- sample_data   -- общий демо-датасет MotherDuck

После ATTACH 'md:' у вас в одной сессии и локальные, и облачные таблицы, и обращаться к ним можно одним запросом. Поверх этого MotherDuck даёт то, чего у embedded-DuckDB нет по определению:

  • Хранилище в облаке — базы лежат на стороне сервиса, не на вашем диске; доступны с любой машины, с которой вы подключились.
  • Совместный доступ — облачную базу или её часть можно расшарить коллегам; они подключаются к тем же данным.
  • Серверный compute — у облака есть собственные вычислительные узлы («ducklings»), которые исполняют запросы независимо от вашего ноутбука.
  • Расписание и фоновые задачи — запросы по cron без постоянно включённой локальной машины.
  • Веб-интерфейс — UI для запросов; внутри него, кстати, работает DuckDB-WASM из прошлого урока, а результаты кешируются на клиенте.

Важно: с точки зрения SQL вы пишете обычный DuckDB-диалект. Friendly SQL, чтение Parquet, оконные функции — всё то же самое. MotherDuck меняет не язык, а то, где физически крутится исполнение.

NOTE

MotherDuck — проприетарный сервис, основанный частью команды, причастной к DuckDB. Сам DuckDB остаётся MIT-лицензированным и полностью самодостаточным: MotherDuck не нужен, чтобы пользоваться DuckDB. Это отдельный продукт, который решает задачи «облако, шеринг, расписание» поверх движка.


Проблема, которую решает dual execution

Представьте типичную ситуацию: большая таблица фактов (сотни гигабайт) лежит в облаке MotherDuck, а маленький свежий CSV с локальными правками — у вас на ноутбуке. Вам нужен JOIN между ними. У классической архитектуры два плохих варианта.

Вариант «всё в облаке»: залить локальный CSV в облако, потом исполнить запрос там. Но если CSV меняется каждый раз, заливка — постоянные накладные расходы.

Вариант «всё локально»: скачать сотни гигабайт облачной таблицы на ноутбук и соединить локально. Это бессмысленно — тащить терабайт по сети ради JOIN с маленьким файлом.

Запрос над данными в двух местах
Большая таблицаСотни гигабайт фактов. Лежит в облаке MotherDuck. Тащить её на клиент по сети нерационально.
JOIN
Маленький файлСвежий локальный CSV с правками. Лежит на ноутбуке. Заливать его в облако перед каждым запросом — лишние накладные расходы.

Правильный ответ очевиден человеку: тяжёлую часть (сканирование и предагрегацию большой таблицы) надо делать там, где эта таблица лежит, — в облаке, а в обмене по сети должен участвовать только маленький результат. Dual execution автоматизирует ровно это рассуждение.


Как работает dual execution

Dual execution (его также называют hybrid execution) — это способность одного запроса исполняться частично локально и частично в облаке. Решение принимает оптимизатор: он строит план запроса и для каждого фрагмента определяет, на какой стороне его выполнить.

Логика решения сводится к одному принципу — минимизировать перемещение данных. Оператор стремится исполниться там, где находятся его входные данные:

  • Скан большой облачной таблицы и фильтры/агрегации над ней — в облаке, рядом с данными.
  • Скан локального файла и операции над ним — на клиенте.
  • Соединение двух сторон происходит там, куда дешевле доставить меньший из промежуточных результатов.
Dual execution: оптимизатор разрезает план по границе локально/облако
Единый SQL-запросВы пишете обычный DuckDB SQL. Не указываете вручную, что где исполнять.
оптимизатор строит план
Облачная частьСкан и предагрегация большой облачной таблицы выполняются на узлах MotherDuck, рядом с данными. По сети уходит только сжатый промежуточный результат.
Локальная частьСкан локального файла и финальное соединение с присланным из облака результатом выполняются на клиенте.
результат
ОтветИтоговый результат собирается и возвращается пользователю. По сети двигались только компактные промежуточные данные, а не исходные таблицы.

Для пользователя это прозрачно. Вы пишете обычный запрос, не размечая операторы. То, что часть плана уехала в облако, видно в EXPLAIN: в плане появляются операторы, помеченные как удалённые.

ATTACH 'md:';

-- local_edits — локальный CSV; sales — большая таблица в облаке
EXPLAIN
SELECT s.region, sum(s.amount) AS total
FROM my_cloud_db.sales AS s
JOIN 'local_edits.csv' AS e ON s.region = e.region
GROUP BY s.region;

-- В плане видно разделение: скан и предагрегация sales помечены
-- как выполняемые на стороне MotherDuck, а скан local_edits.csv
-- и финальный JOIN — на стороне клиента. По сети между ними
-- двигается только агрегированный промежуточный результат.

Ключевой выигрыш: по сети едет не исходная 300-гигабайтная таблица, а её агрегат — возможно, несколько килобайт. Без dual execution выбор был бы между «залить локальное в облако» и «скачать облачное локально»; dual execution выбирает третий путь — двигать только то, что после фильтрации и агрегации стало маленьким.

TIP

Эвристика «оператор исполняется там, где его данные» объясняет, как писать запросы под dual execution. Фильтруйте и агрегируйте большую облачную таблицу до соединения с локальными данными: чем раньше в плане большой объём схлопывается в маленький, тем меньше едет по сети. Это та же дисциплина, что и pushdown, только граница проходит не «движок против файла», а «клиент против облака».


Когда MotherDuck оправдан, а когда хватает чистого DuckDB

MotherDuck решает конкретный набор задач, и за пределами этого набора чистого DuckDB достаточно.

ЗадачаЧистый DuckDBMotherDuck
Локальная аналитика, данные на одной машинеПолностью закрываетНе нужен
Embedded-движок внутри приложенияПолностью закрываетНе нужен
Общая база для командыНет встроенного шерингаОблачное хранилище + шеринг
Запросы по расписанию без включённой машиныНужен внешний шедулерВстроенные scheduled-задачи
Compute мощнее ноутбукаОграничен локальным железомСерверные узлы облака
Запрос над «локальное + облачное» вместеТолько локальные источникиDual execution

Принцип простой: DuckDB — это движок, и для всего, что укладывается в «один процесс, одна машина, локальные данные», он самодостаточен и MIT-бесплатен. MotherDuck нужен, когда появляются именно облачные требования — совместный доступ, постоянное хранилище вне вашего диска, расписание, масштаб compute. Dual execution — это то, что делает переход в облако нерезким: вы не обязаны выбирать между «всё локально» и «всё в облаке», движок сам проводит границу по каждому запросу.


Попробуй сам

Для этого задания нужен бесплатный аккаунт MotherDuck (есть free tier). Установите свежий DuckDB CLI — поддержка md: встроена в движок.

Задания:

  1. Запустите duckdb и выполните ATTACH 'md:'; — пройдите аутентификацию в браузере. После подключения выполните SHOW DATABASES; и найдите общий датасет sample_data.
  2. Выполните агрегирующий запрос над таблицей из sample_data (например, посчитайте строки и сгруппируйте по какой-нибудь колонке). Этот запрос целиком исполняется в облаке.
  3. Создайте локально маленький CSV или таблицу в memory-базе и напишите запрос, соединяющий её с облачной таблицей из sample_data. Запустите этот же запрос через EXPLAIN и найдите в плане операторы, помеченные как удалённые (исполняемые в облаке).
  4. Поменяйте запрос так, чтобы фильтр по большой облачной таблице стоял до JOIN, и подумайте (по плану EXPLAIN), как это влияет на объём данных, который должен пройти по сети между облаком и клиентом.
Trino: распределённый аналитический движок как альтернатива
Проверка знанийKnowledge check
Что такое dual execution в MotherDuck, какую проблему он решает и по какому принципу оптимизатор решает, где исполнять каждый фрагмент запроса?
ОтветAnswer
Dual execution (hybrid execution) — это способность одного SQL-запроса исполняться частично на локальной машине клиента и частично на серверных узлах облака MotherDuck. Он решает проблему запросов над данными, лежащими в двух местах одновременно: например, JOIN большой таблицы фактов в облаке с маленьким свежим локальным файлом. Без dual execution пришлось бы выбирать между двумя плохими вариантами — залить локальные данные в облако или скачать всю облачную таблицу на клиент. Решение, где исполнять каждый фрагмент плана, принимает оптимизатор, и принцип у него один — минимизировать перемещение данных по сети: каждый оператор стремится исполниться там, где находятся его входные данные. Скан и предагрегация большой облачной таблицы выполняются в облаке рядом с данными, скан локального файла — на клиенте, а по сети двигается только компактный промежуточный результат после фильтрации и агрегации, а не исходные таблицы. Для пользователя это прозрачно: он пишет обычный DuckDB SQL, а разделение плана видно в выводе EXPLAIN. Практический вывод — фильтровать и агрегировать большую облачную таблицу до соединения с локальными данными, чтобы по сети шло как можно меньше.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 4. Что такое dual execution в MotherDuck?

Закончили урок?

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

Войдите чтобы оценить урок

Прогресс модуля
0 из 6