Дистрибуция
Что это такое
Дистрибуция (distribution) — это правило, по которому строки таблицы распределяются между узлами в распределённой базе данных или MPP-кластере.
Задача дистрибуции — чтобы данные лежали равномерно и рядом с тем, где они нужны. Иначе часть узлов перегреется, а часть будет простаивать.
Зачем нужна
- равномерная нагрузка на кластер
- меньше пересылок данных по сети
- быстрее JOIN, агрегации и фильтры
Основные виды дистрибуции
1) Hash Distribution (по хэшу)
Самый популярный вариант. Берём ключ, считаем хэш и кладём строку на узел по хэш-значению.
Плюсы: равномерное распределение.
Минусы: важен правильный выбор ключа.
Когда использовать:
- часто делаете JOIN по одному ключу
- хотите равномерную нагрузку
2) Random / Round-robin
Строки раскладываются случайно или по кругу.
Плюсы: просто и равномерно.
Минусы: JOIN почти всегда требует пересылки данных.
Когда использовать:
- staging
- временные таблицы
- когда нет хорошего ключа
3) Replicated / Broadcast
Таблица копируется на все узлы.
Плюсы: быстрые JOIN с большими таблицами.
Минусы: подходит только для маленьких таблиц.
Когда использовать:
- справочники
- маленькие dimension-таблицы
Как выбрать ключ дистрибуции
Правило простое:
- выбираем столбец, по которому чаще всего делают JOIN
- он должен быть равномерным (высокая кардинальность)
- избегаем перекоса (skew)
Плохие ключи:
- столбец с 2–3 значениями
- дата (часто концентрируется в последних партициях)
Что такое skew (перекос)
Это ситуация, когда много данных попадает на один узел. В итоге один сервер перегружен, остальные простаивают.
Причины:
- плохой ключ
- "горячие" значения
Пример (на SQL)
-- Пример (в духе Greenplum/Redshift)
CREATE TABLE orders (
order_id BIGINT,
customer_id BIGINT,
amount NUMERIC(10,2)
)
DISTRIBUTED BY (customer_id);Итог
Дистрибуция — это про то, где физически лежат ваши строки. Правильно выбранный ключ может ускорить запросы в разы, неправильный — убить производительность даже на мощном кластере.