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 

Параметры

Параметр

Описание

partition_columns

Имена столбцов партиционирования. Допустимые значения: строки (кроме BINARY), дата/дата‑время, целые числа.

function_expression

Функциональное выражение для преобразования столбца партиционирования в нужный тип. Поддерживаются from_unixtime, from_unixtime_ms и str2date.
Примечание
Range partitioning поддерживает только одно функциональное выражение.

partition_name

Имя партиции. Рекомендуется выбирать осмысленные имена, исходя из сценария.

Примеры

  1. Ручное задание диапазонов значений для столбца‑даты.

    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")
    )
    
  2. Ручное задание диапазонов для целочисленного столбца.

    PARTITION BY RANGE (int_col) (
        PARTITION p1 VALUES LESS THAN ("20200131"),
        PARTITION p2 VALUES LESS THAN ("20200229"),
        PARTITION p3 VALUES LESS THAN ("20200331")
    )
    
  3. Пакетное создание с одинаковым интервалом дат.

    PARTITION BY RANGE (date_col) (
        START ("2021-01-01") END ("2021-01-04") EVERY (INTERVAL 1 DAY)
    )
    
  4. Пакетное создание с разными интервалами дат.

    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)
    )
    
  5. Пакетное создание с одинаковым числовым интервалом.

    PARTITION BY RANGE (int_col) (
        START ("1") END ("10") EVERY (1)
    )
    
  6. Пакетное создание с разными числовыми интервалами.

    PARTITION BY RANGE (int_col) (
        START ("1") END ("10") EVERY (1),
        START ("10") END ("100") EVERY (10)
    )
    
  7. Использование 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")
    )
    
  8. Использование 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

Включает динамическое партиционирование. TRUE/FALSE. По умолчанию TRUE.

dynamic_partition.time_unit

Yes

Гранулярность: HOUR, DAY, WEEK, MONTH, YEAR. Определяет формат суффикса имён партиций.

  • HOUR: столбец партиционирования только DATETIME; формат yyyyMMddHH, напр. 2020032101.
  • DAY: формат yyyyMMdd, напр. 20200321.
  • WEEK: формат yyyy_ww, напр. 2020_13.
  • MONTH: формат yyyyMM, напр. 202003.
  • YEAR: формат yyyy, напр. 2020.

dynamic_partition.time_zone

No

Часовой пояс для динамических партиций. По умолчанию системный.

dynamic_partition.start

No

Начальное смещение. Отрицательное целое. Партиции до этого смещения удаляются относительно «текущего» дня/недели/месяца (в зависимости от time_unit). По умолчанию -2147483648 (история не удаляется).

dynamic_partition.end

Yes

Конечное смещение. Положительное целое. Партиции от «текущего» дня/недели/месяца до этого смещения создаются заранее.

dynamic_partition.prefix

No

Префикс имён динамических партиций. По умолчанию p.

dynamic_partition.buckets

No

Число бакетов на динамическую партицию. По умолчанию — как задано словом BUCKETS или определено автоматически.

dynamic_partition.history_partition_num

No

Число исторических партиций, создаваемых механизмом динамического партиционирования. По умолчанию 0. Поддерживается с v2.5.2.

dynamic_partition.start_day_of_week

No

Для WEEK — первый день недели. 1..7 (1 — понедельник, 7 — воскресенье). По умолчанию 1.

dynamic_partition.start_day_of_month

No

Для MONTH — первый день месяца. 1..28. По умолчанию 1. Значения 29, 30, 31 недопустимы.

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 можно изменять другие свойства таблицы.