Распределение данных (distribution) в Greenplum предполагает хранение данных таблицы на различных сегментах кластера. 2 Сегменты представляют собой инстансы PostgreSQL, поднятые на сервере. 2 На одном сервере может быть несколько сегментов Greenplum. 2
Для каждой таблицы задаётся своя политика распределения. 1 Существуют несколько её видов: 1
- DISTRIBUTED BY (column(-s)) — хеш-распределение. 2 Конкретный сегмент выбирается на основе хешей, которые рассчитываются по указанным полям. 2 Рекомендуется использовать для таблиц, имеющих первичные ключи (PRIMARY KEY) либо столбцы с уникальными значениями (UNIQUE). 25
- DISTRIBUTED REPLICATED — распределение данных, при котором копия таблицы сохраняется на каждом сегменте кластера. 2 Рекомендуется для небольших таблиц (например, для справочника валют и т. д.). 2 Позволяет избежать любых перемещений данных при JOIN-запросах. 2
- DISTRIBUTED RANDOMLY — случайное распределение данных с использованием алгоритма round-robin. 25 Поскольку система выбирает сегменты случайным образом, равномерность распределения данных между ними не гарантируется. 25 Рекомендуется для случаев, когда в таблицах нет столбцов с уникальными значениями, а размер таблиц достаточно большой. 25
Оптимальное, то есть равномерное, распределение данных — самый важный фактор в Greenplum. 3 Если данные неравномерно распределены, сегменты с большим количеством данных будут выполняться дольше. 3 Поэтому каждый сегмент должен иметь примерно равное количество строк и выполнять примерно одинаковый объём обработки. 3