Перейти к содержимому
Последнее обновление

Партиционирование и бакетирование

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

Базовый вариант для данных временных рядов​

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

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

CREATE DATABASE IF NOT EXISTS partition_demo;
USE partition_demo;

CREATE TABLE sales (
sale_time DATETIME NOT NULL,
order_id BIGINT NOT NULL,
amount DECIMAL(10, 2)
)
DUPLICATE KEY(sale_time, order_id)
AUTO PARTITION BY RANGE (date_trunc(sale_time, 'day')) ()
DISTRIBUTED BY HASH(order_id) BUCKETS AUTO
PROPERTIES (
"replication_num" = "1",
"estimate_partition_size" = "1G"
);

INSERT INTO sales VALUES
('2026-10-14 10:00:00', 1, 12.50),
('2026-10-15 11:00:00', 2, 20.00);

SELECT COUNT(*) AS row_count FROM sales;
+-----------+
| row_count |
+-----------+
| 2 |
+-----------+

В результате загрузки создаются две дневные партиции. BUCKETS AUTO выбирает количество бакетов на основе предполагаемого размера партиции и ресурсов кластера; размер существующих партиций при этом не изменяется. Выбирайте интервал партиционирования так, чтобы не создавать слишком много небольших партиций. Небольшие справочные таблицы, а также таблицы, которым не нужны фильтрация по времени или управление сроком хранения, могут вместо этого использовать одну партицию.

Выбор схемы​

РешениеБазовый вариантКогда выбирать другой вариант
ПартиционированиеАвтоматическое партиционирование для создания партиций по времени или спискам значений по мере необходимостиИспользуйте ручное партиционирование для произвольных диапазонов, числовых диапазонов или сгруппированных значений LIST. Используйте динамическое партиционирование, если нужны создание по расписанию и скользящее временное окно.
Метод бакетированияХеширование по столбцам, которые подходят для фильтров на равенство и обеспечивают равномерное распределение данныхСлучайное распределение по бакетам может уменьшить перекос данных в таблицах DUPLICATE, но не поддерживает отсечение бакетов. См. раздел Бакетирование данных.
Количество бакетовBUCKETS AUTO с характерным значением estimate_partition_sizeИспользуйте фиксированное количество, если нужен явный контроль. При выборе размера таблетов и степени параллелизма запросов учитывайте накладные расходы на управление таблетами.

Удаление устаревших партиций​

Режимы управления сроком хранения задают разные политики:

Режим партиционированияПараметрПравило хранения
Динамическое партиционированиеdynamic_partition.start (например, -7)Окно относительно текущего времени с учётом настроенной единицы времени и часового пояса
Автоматическое партиционирование (RANGE)partition.retention_count (например, 3)Сохраняются N последних исторических партиций по значению партиции; текущие и будущие партиции сохраняются

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

Для таблицы из примера следующая политика сохраняет три последние исторические партиции в дополнение к текущим и будущим партициям:

ALTER TABLE partition_demo.sales SET ("partition.retention_count" = "3");

В дальнейшем планировщик FE удаляет лишние исторические партиции. Этот параметр применяется только к таблицам AUTO RANGE и не может использоваться при включённом динамическом партиционировании. Сведения о работе планировщика и ограничениях для отдельных версий, включая изменения в Doris 4.1.4, см. в разделе Автоматическое партиционирование: управление жизненным циклом.

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

Как это работает​

Table → Partition (by column value) → Bucket (hash or random) → Tablet (shard on a BE node)

Партиции позволяют отсекать ненужные данные при выполнении запросов и управлять жизненным циклом данных. Бакеты обеспечивают параллельное чтение и запись. Подробнее о таблетах, репликах, размещении на узлах и командах администрирования см. в разделе Как работают партиционирование и бакетирование.

Дальнейшие шаги​