Range partitioning (Legacy)¶
Range partitioning подходит для хранения простых непрерывных данных, например временных рядов или последовательных числовых диапазонов.
На базе range partitioning вы можете включить динамическое партиционирование, которое позволяет управлять сроком жизни (TTL) партиций.
Начиная с v3.4, expression partitioning дополнительно оптимизировано, унифицирует все стратегии партиционирования и поддерживает более сложные решения. Рекомендуется в большинстве случаев и в будущих релизах заменит range partitioning.
Введение¶
Range partitioning уместно для данных, по которым часто выполняются запросы по непрерывным диапазонам дат или чисел. Кроме того, его можно применять в особых случаях, когда исторические данные нужно делить по месяцам, а свежие — по дням.
Необходимо явно определить столбцы партиционирования и сопоставление партиций диапазонам значений этих столбцов. При загрузке данных StarRocks направляет строки в соответствующие партиции согласно диапазонам, в которые попадают значения столбца партиционирования.
Что касается типов, до v3.3.0 range partitioning поддерживал только столбцы типов date и integer. С v3.3.0 можно использовать три специальные time‑функции как столбцы партиционирования. При явном задании соответствия партиций диапазонам значений сначала используйте time‑функцию для преобразования значений timestamp или строк в даты, а затем делите партиции по полученным датам.
Если столбец содержит timestamp, используйте функции
from_unixtimeилиfrom_unixtime_msдля преобразования в дату при делении партиций. При использованииfrom_unixtimeподдерживаются типы INT и BIGINT; приfrom_unixtime_ms— только BIGINT.Если столбец — строка (STRING, VARCHAR или CHAR), используйте функцию
str2dateдля преобразования строки в дату при делении партиций.
Использование¶
Синтаксис¶
PARTITION BY RANGE ( partition_columns | function_expression ) ( single_range_partition | multi_range_partitions )
partition_columns ::=
<column> [, ...]
function_expression ::=
from_unixtime(column)
| from_unixtime_ms(column)
| str2date(column)
single_range_partition::=
PARTITION <partition_name> VALUES partition_key_desc
partition_key_desc::=
LESS THAN { MAXVALUE | value_list }
| value_range
-- value_range — полуинтервал [левая_граница включительно, правая_граница не включительно]. Пример: `[202201, 202212)`.
-- Необходимо явно указать левую квадратную скобку `[` для полуинтервала.
value_range::=
[value_list, value_list)
value_list::=
( <value> [, ...] )
multi_range_partitions::=
{ PARTITIONS START ("<start_date_value>") END ("<end_date_value>") EVERY ( INTERVAL <int_value> time_unit )
| PARTITIONS START ("<start_integer_value>") END ("<end_integer_value>") EVERY ( <int_value> ) } -- Значения START/END заключаются в двойные кавычки, даже для целых. Значение EVERY — без кавычек.
time_unit::=
HOUR | DAY | WEEK | MONTH | YEAR
Параметры¶
Параметр |
Описание |
|---|---|
|
Имена столбцов партиционирования. Допустимые значения: строки (кроме BINARY), дата/дата‑время, целые числа. |
|
Функциональное выражение для преобразования столбца партиционирования в нужный тип. Поддерживаются from_unixtime, from_unixtime_ms и str2date. |
|
Имя партиции. Рекомендуется выбирать осмысленные имена, исходя из сценария. |
Примеры¶
Ручное задание диапазонов значений для столбца‑даты.
PARTITION BY RANGE(date_col)( PARTITION p1 VALUES LESS THAN ("2020-01-31"), PARTITION p2 VALUES LESS THAN ("2020-02-29"), PARTITION p3 VALUES LESS THAN ("2020-03-31") )Ручное задание диапазонов для целочисленного столбца.
PARTITION BY RANGE (int_col) ( PARTITION p1 VALUES LESS THAN ("20200131"), PARTITION p2 VALUES LESS THAN ("20200229"), PARTITION p3 VALUES LESS THAN ("20200331") )Пакетное создание с одинаковым интервалом дат.
PARTITION BY RANGE (date_col) ( START ("2021-01-01") END ("2021-01-04") EVERY (INTERVAL 1 DAY) )Пакетное создание с разными интервалами дат.
PARTITION BY RANGE (date_col) ( START ("2019-01-01") END ("2021-01-01") EVERY (INTERVAL 1 YEAR), START ("2021-01-01") END ("2021-05-01") EVERY (INTERVAL 1 MONTH), START ("2021-05-01") END ("2021-05-04") EVERY (INTERVAL 1 DAY) )Пакетное создание с одинаковым числовым интервалом.
PARTITION BY RANGE (int_col) ( START ("1") END ("10") EVERY (1) )Пакетное создание с разными числовыми интервалами.
PARTITION BY RANGE (int_col) ( START ("1") END ("10") EVERY (1), START ("10") END ("100") EVERY (10) )Использование from_unixtime для преобразования timestamp (строка) в дату.
PARTITION BY RANGE(from_unixtime(timestamp_col)) ( PARTITION p1 VALUES LESS THAN ("2021-01-01"), PARTITION p2 VALUES LESS THAN ("2021-01-02"), PARTITION p3 VALUES LESS THAN ("2021-01-03") )Использование str2date для преобразования строки в дату.
PARTITION BY RANGE(str2date(string_col, '%Y-%m-%d'))( PARTITION p1 VALUES LESS THAN ("2021-01-01"), PARTITION p2 VALUES LESS THAN ("2021-01-02"), PARTITION p3 VALUES LESS THAN ("2021-01-03") )
Динамическое партицирование¶
StarRocks поддерживает динамическое партиционирование, которое автоматически управляет TTL партиций: создаёт новые партиции для входящих данных и удаляет истёкшие. Это значительно снижает затраты на обслуживание.
Включение динамического партиционирования¶
Рассмотрим таблицу site_access. Чтобы включить динамическое партиционирование, задайте параметр PROPERTIES. Список свойств см. в описании CREATE TABLE.
CREATE TABLE site_access(
event_day DATE,
site_id INT DEFAULT '10',
city_code VARCHAR(100),
user_name VARCHAR(32) DEFAULT '',
pv BIGINT DEFAULT '0'
)
DUPLICATE KEY(event_day, site_id, city_code, user_name)
PARTITION BY RANGE(event_day)(
PARTITION p20200321 VALUES LESS THAN ("2020-03-22"),
PARTITION p20200322 VALUES LESS THAN ("2020-03-23"),
PARTITION p20200323 VALUES LESS THAN ("2020-03-24"),
PARTITION p20200324 VALUES LESS THAN ("2020-03-25")
)
DISTRIBUTED BY HASH(event_day, site_id)
PROPERTIES(
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-3",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "32",
"dynamic_partition.history_partition_num" = "0"
);
PROPERTIES:
parameter |
required |
description |
|---|---|---|
dynamic_partition.enable |
No |
Включает динамическое партиционирование. |
dynamic_partition.time_unit |
Yes |
Гранулярность:
|
dynamic_partition.time_zone |
No |
Часовой пояс для динамических партиций. По умолчанию системный. |
dynamic_partition.start |
No |
Начальное смещение. Отрицательное целое. Партиции до этого смещения удаляются относительно «текущего» дня/недели/месяца (в зависимости от |
dynamic_partition.end |
Yes |
Конечное смещение. Положительное целое. Партиции от «текущего» дня/недели/месяца до этого смещения создаются заранее. |
dynamic_partition.prefix |
No |
Префикс имён динамических партиций. По умолчанию |
dynamic_partition.buckets |
No |
Число бакетов на динамическую партицию. По умолчанию — как задано словом BUCKETS или определено автоматически. |
dynamic_partition.history_partition_num |
No |
Число исторических партиций, создаваемых механизмом динамического партиционирования. По умолчанию |
dynamic_partition.start_day_of_week |
No |
Для |
dynamic_partition.start_day_of_month |
No |
Для |
dynamic_partition.replication_num |
No |
Число реплик для tablet в динамически создаваемых партициях. По умолчанию — как при создании таблицы. |
Если столбец партиционирования имеет тип INT, формат должен быть yyyyMMdd независимо от гранулярности.
Конфигурация FE:
dynamic_partition_check_interval_seconds: интервал планирования динамического партиционирования. По умолчанию 600 с. Периодически проверяет соответствие партиций свойствам в PROPERTIES и при необходимости создаёт/удаляет их.
Просмотр динамических партиций¶
После включения динамического партиционирования входящие данные непрерывно и автоматически партиционируются. Текущие партиции можно посмотреть так. Например, при текущей дате 2020‑03‑25 будут видны партиции в диапазоне 2020‑03‑25..2020‑03‑28:
SHOW PARTITIONS FROM site_access;
[types: [DATE]; keys: [2020-03-25]; ‥types: [DATE]; keys: [2020-03-26]; )
[types: [DATE]; keys: [2020-03-26]; ‥types: [DATE]; keys: [2020-03-27]; )
[types: [DATE]; keys: [2020-03-27]; ‥types: [DATE]; keys: [2020-03-28]; )
[types: [DATE]; keys: [2020-03-28]; ‥types: [DATE]; keys: [2020-03-29]; )
Чтобы создать исторические партиции при создании таблицы, укажите dynamic_partition.history_partition_num. Например, при значении 3 и текущей дате 2020‑03‑25 будут видны партиции 2020‑03‑22..2020‑03‑28:
SHOW PARTITIONS FROM site_access;
[types: [DATE]; keys: [2020-03-22]; ‥types: [DATE]; keys: [2020-03-23]; )
[types: [DATE]; keys: [2020-03-23]; ‥types: [DATE]; keys: [2020-03-24]; )
[types: [DATE]; keys: [2020-03-24]; ‥types: [DATE]; keys: [2020-03-25]; )
[types: [DATE]; keys: [2020-03-25]; ‥types: [DATE]; keys: [2020-03-26]; )
[types: [DATE]; keys: [2020-03-26]; ‥types: [DATE]; keys: [2020-03-27]; )
[types: [DATE]; keys: [2020-03-27]; ‥types: [DATE]; keys: [2020-03-28]; )
[types: [DATE]; keys: [2020-03-28]; ‥types: [DATE]; keys: [2020-03-29]; )
Изменение свойств динамического партиционирования¶
Для изменения свойств, например отключения динамического партиционирования, используйте ALTER TABLE:
ALTER TABLE site_access
SET("dynamic_partition.enable"="false");
Для просмотра свойств динамического партиционирования используйте
SHOW CREATE TABLE.Также через
ALTER TABLEможно изменять другие свойства таблицы.