Динамическое партиционирование
Динамическое партиционирование создаёт и удаляет разделы по расписанию. Используйте автоматическое партиционирование, если разделы должны создаваться по мере необходимости при поступлении данных. Выбирайте режим хранения в зависимости от того, нужно ли ограничить временной интервал или количество исторических разделов.
Динамическое партиционирование добавляет и удаляет разделы в соответствии с настроенными правилами, обеспечивая управление жизненным циклом разделов таблиц (TTL) и снижая нагрузку на хранилище. При работе с журналами и временными рядами динамическое партиционирование обычно используют для регулярного удаления данных с истёкшим сроком хранения.
Сценарии применения
| Сценарий | Описание |
|---|---|
| Управление данными журналов | Хранение журналов за последние N дней с разбиением по дням или часам и автоматическим удалением устаревших разделов |
| Управление временными рядами | Автоматическое обслуживание разделов по времени для мониторинга, IoT и подобных задач |
| Управление жизненным циклом данных | Ограничение периода хранения данных с помощью TTL и сокращение затрат на хранение |
| Предварительное создание будущих разделов | Создание разделов на следующие N дней заранее, чтобы избежать ошибок записи из-за отсутствующих разделов |
На следующей схеме показан пример использования динамического партиционирования для управления жизненным циклом данных. В примере заданы следующие правила:
- Единица времени планирования
dynamic_partition.time_unitимеет значениеDAY, поэтому разделы организованы по дням. - Начальное смещение
dynamic_partition.startимеет значение-1, что позволяет сохранять раздел за предыдущий день. - Конечное смещение
dynamic_partition.endимеет значение2, что позволяет сохранять разделы на следующие два дня.
Согласно этим правилам по мере течения времени всегда сохраняются четыре раздела: раздел за предыдущий день, раздел за текущий день и разделы на следующие два дня.

Ограничения
При использовании динамического партиционирования действуют следующие ограничения:
- Динамическое партиционирование поддерживает только партиционирование Range по столбцам
DATE,DATETIMEилиTIMESTAMP_NS. - Динамическое партиционирование поддерживает только один ключ партиционирования.
Создание таблицы с динамическим партиционированием
Чтобы создать таблицу с динамическим партиционированием, укажите свойства dynamic_partition при создании таблицы:
CREATE TABLE test_dynamic_partition(
order_id BIGINT,
create_dt DATE,
username VARCHAR(20)
)
DUPLICATE KEY(order_id)
PARTITION BY RANGE(create_dt) ()
DISTRIBUTED BY HASH(order_id) BUCKETS 10
PROPERTIES(
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-1",
"dynamic_partition.end" = "2",
"dynamic_partition.prefix" = "p",
"dynamic_partition.create_history_partition" = "true"
);
Подробнее о параметрах dynamic_partition см. в разделе Свойства динамического партиционирования.
Управление динамическими разделами
Изменение свойств динамического партиционирования
Изменения динамических разделов, внесённые с помощью оператора ALTER TABLE, вступают в силу не сразу. Doris проверяет динамические разделы с интервалом, заданным параметром dynamic_partition_check_interval_seconds, и выполняет необходимые операции создания и удаления разделов.
В следующем примере оператор ALTER TABLE преобразует таблицу с обычным партиционированием в таблицу с динамическим партиционированием:
CREATE TABLE test_partition(
order_id BIGINT,
create_dt DATE,
username VARCHAR(20)
)
DUPLICATE KEY(order_id)
PARTITION BY RANGE(create_dt) ()
DISTRIBUTED BY HASH(order_id) BUCKETS 10;
ALTER TABLE test_partition SET (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-1",
"dynamic_partition.end" = "2",
"dynamic_partition.prefix" = "p",
"dynamic_partition.create_history_partition" = "true"
);
Просмотр состояния планирования динамических разделов
Используйте SHOW-DYNAMIC-PARTITION, чтобы просмотреть состояние планирования всех таблиц с динамическим партиционированием в текущей базе данных:
SHOW DYNAMIC PARTITION TABLES;
+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
| TableName | Enable | TimeUnit | Start | End | Prefix | Buckets | StartOf | LastUpdateTime | LastSchedulerTime | State | LastCreatePartitionMsg | LastDropPartitionMsg | ReservedHistoryPeriods |
+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
| d3 | true | WEEK | -3 | 3 | p | 1 | MONDAY | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | [2021-12-01,2021-12-31] |
| d5 | true | DAY | -7 | 3 | p | 32 | N/A | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d4 | true | WEEK | -3 | 3 | p | 1 | WEDNESDAY | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d6 | true | MONTH | -2147483648 | 2 | p | 8 | 3rd | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d2 | true | DAY | -3 | 3 | p | 32 | N/A | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d7 | true | MONTH | -2147483648 | 5 | p | 8 | 24th | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
7 rows in set (0.02 sec)
Управление историческими разделами
Если количество динамических разделов задано свойствами start и end, исторические разделы по умолчанию не создаются, чтобы избежать длительного ожидания при одновременном создании всех разделов. Создаются только разделы для времени после текущего момента. Чтобы создать все разделы сразу, включите параметр create_history_partition.
Например, если текущая дата 2024-10-11 и заданы start = -2, end = 2:
- При
create_history_partition = trueнемедленно создаются 5 разделов для диапазона[10-09, 10-13]. - При
create_history_partition = falseсоздаются только 3 раздела для диапазона[10-11, 10-13].
Параметры динамического партиционирования
Свойства динамического партиционирования
Параметры правил динамического партиционирования используют префикс dynamic_partition. Доступны следующие параметры правил:
| Параметр | Обязательный | Описание |
|---|---|---|
dynamic_partition.enable | Нет | Определяет, включено ли динамическое партиционирование. Допустимые значения: TRUE и FALSE. Если указаны другие обязательные параметры динамического партиционирования, по умолчанию используется TRUE. |
dynamic_partition.time_unit | Да | Единица времени планирования динамического партиционирования. Допустимые значения: HOUR, DAY, WEEK, MONTH и YEAR. Они означают, что разделы создаются или удаляются по часам, дням, неделям, месяцам или годам соответственно. |
dynamic_partition.start | Нет | Начальное смещение для динамического партиционирования, выраженное отрицательным числом. Значение по умолчанию: -2147483648, при котором исторические разделы не удаляются. С учётом свойства time_unit удаляются разделы, диапазоны которых находятся до этого смещения относительно текущего дня (недели / месяца). Создание отсутствующих исторических разделов между этим смещением и текущим моментом определяется параметром dynamic_partition.create_history_partition. |
dynamic_partition.end | Да | Конечное смещение для динамического партиционирования, выраженное положительным числом. С учётом свойства time_unit разделы для соответствующего диапазона заранее создаются относительно текущего дня (недели / месяца). |
dynamic_partition.prefix | Да | Префикс имён динамически создаваемых разделов. |
dynamic_partition.buckets | Нет | Количество бакетов для динамически создаваемых разделов. Этот параметр переопределяет количество бакетов, указанное в DISTRIBUTED. |
dynamic_partition.replication_num | Нет | Количество реплик для динамически создаваемых разделов. Если параметр не задан, используется количество реплик, указанное при создании таблицы. |
dynamic_partition.create_history_partition | Нет | Значение по умолчанию: false. При значении true Doris автоматически создаёт все разделы по правилам, описанным ниже. При этом параметр FE max_dynamic_partition_num ограничивает общее количество разделов, чтобы избежать одновременного создания слишком большого их числа. Если количество создаваемых разделов превышает max_dynamic_partition_num, операция отклоняется. Этот параметр не действует, если свойство start не задано. |
dynamic_partition.history_partition_num | Нет | Если create_history_partition имеет значение true, этот параметр задаёт количество создаваемых исторических разделов. Значение по умолчанию: -1, что означает отсутствие настройки. Эта переменная действует так же, как dynamic_partition.start; рекомендуется задавать только одну из них. |
dynamic_partition.start_day_of_week | Нет | Если time_unit имеет значение WEEK, этот параметр задаёт начало недели. Допустимый диапазон: от 1 до 7, где 1 означает понедельник, а 7 означает воскресенье. Значение по умолчанию: 1, то есть неделя начинается в понедельник. |
dynamic_partition.start_day_of_month | Нет | Если time_unit имеет значение MONTH, этот параметр задаёт начало месяца. Допустимый диапазон: от 1 до 28, где 1 означает 1-е число месяца, а 28 означает 28-е число месяца. Значение по умолчанию: 1, то есть началом месяца считается 1-е число. Начало месяца с 29-го, 30-го или 31-го числа не поддерживается, чтобы избежать неоднозначности из-за високосных лет и разной продолжительности месяцев. |
dynamic_partition.reserved_history_periods | Нет | Временные диапазоны исторических разделов, которые нужно сохранить. Если dynamic_partition.time_unit имеет значение DAY / WEEK / MONTH / YEAR, задайте значение в формате [yyyy-MM-dd,yyyy-MM-dd],[...,...]. Если dynamic_partition.time_unit имеет значение HOUR, задайте значение в формате [yyyy-MM-dd HH:mm:ss,yyyy-MM-dd HH:mm:ss],[...,...]. Если параметр не задан, используется значение по умолчанию "NULL". |
dynamic_partition.time_zone | Нет | Часовой пояс для динамического партиционирования. По умолчанию используется системный часовой пояс текущего сервера, например Asia/Shanghai. Подробнее о настройках часового пояса см. в разделе Управление часовыми поясами. |
Параметры конфигурации FE
Параметры динамического партиционирования в FE можно изменить через файл конфигурации FE или с помощью команды ADMIN SET FRONTEND CONFIG:
| Параметр | По умолчанию | Описание |
|---|---|---|
dynamic_partition_enable | false | Определяет, включено ли динамическое партиционирование в Doris. Этот параметр влияет только на операции с разделами таблиц с динамическим партиционированием и не затрагивает обычные таблицы. |
dynamic_partition_check_interval_seconds | 600 | Периодичность выполнения потока динамического партиционирования в секундах. |
max_dynamic_partition_num | 500 | Ограничивает максимальное количество разделов, создаваемых при создании таблицы с динамическим партиционированием, чтобы избежать одновременного создания слишком большого их числа. |
Рекомендации по использованию динамического партиционирования
Пример 1: Скользящий период хранения журналов
Разделение по дням с сохранением данных только за последние 7 дней и текущий день, а также с предварительным созданием разделов на следующие 3 дня:
CREATE TABLE tbl1 (
order_id BIGINT,
create_dt DATE,
username VARCHAR(20)
)
PARTITION BY RANGE(create_dt) ()
DISTRIBUTED BY HASH(create_dt)
PROPERTIES (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-7",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "32"
);
Пример 2: Партиционирование по месяцам с сохранением всей истории
Разделение по месяцам без удаления исторических разделов, с предварительным созданием разделов на следующие 2 месяца и началом каждого месяца с 3-го числа:
CREATE TABLE tbl1 (
order_id BIGINT,
create_dt DATE,
username VARCHAR(20)
)
PARTITION BY RANGE(create_dt) ()
DISTRIBUTED BY HASH(create_dt)
PROPERTIES (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "MONTH",
"dynamic_partition.end" = "2",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "8",
"dynamic_partition.start_day_of_month" = "3"
);
Пример 3: Сохранение заданных исторических временных диапазонов
Разделение по дням с сохранением разделов за последние 10 дней и на следующие 10 дней, а также с дополнительным сохранением исторических данных за периоды [2020-06-01, 2020-06-20] и [2020-10-31, 2020-11-15]:
CREATE TABLE tbl1 (
order_id BIGINT,
create_dt DATE,
username VARCHAR(20)
)
PARTITION BY RANGE(create_dt) ()
DISTRIBUTED BY HASH(create_dt)
PROPERTIES (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-10",
"dynamic_partition.end" = "10",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "8",
"dynamic_partition.reserved_history_periods" = "[2020-06-01,2020-06-20],[2020-10-31,2020-11-15]"
);