Documentation
📑 Ускорение БД
Дистрибуция

Дистрибуция

Что это такое

Дистрибуция (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);

Итог

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