Range 分区(不推荐)
Range 分区适用于存储简单的连续数据,如时间序列数据或连续的数值数据。
基于 Range 分区,您可以使用动态分区策略创建分区,该策略允许您管理分区的生命周期(TTL)。
从 v3.4 开始,表达式分区方式进一步优化,以统一所有分区策略,并支持更复杂的解决方案。在大多数情况下,建议您使用表达式分区。表达式分区将在未来版本中逐渐取代 Range 分区策略。
介绍
Range 分区适用于基于连续日期/数值范围的频繁查询数据。此外,它还可以应用于一些特殊情况下,例如需要按月分区历史数据,而按天分区最近数据。
您需要显式定义数据分区列,并建立分区 与分区列值范围之间的映射关系。在数据导入期间,StarRocks 会根据数据分区列值所属的范围将数据分配到相应的分区。
关于分区列的数据类型,在 v3.3.0 之前,Range 分区仅支持日期和整数类型的分区列。从 v3.3.0 开始,可以使用三个特定的时间函数作为分区列。在显式定义分区与分区列值范围之间的映射关系时,您需要首先使用特定的时间函数将时间戳或字符串类型的分区列值转换为日期值,然后根据转换后的日期值划分分区。
- 如果分区列值是时间戳,您需要使用 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 分区仅支持一个函数表达式。 |
partition_name | 分区名称。建议根据业务场景设置适当的分区名称,以区分不同分区中的数据。 |
示例
-
通过手动定义基于日期类型分区列的值范围创建分区。
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 将时间戳(字符串)类型分区列转换为日期类型。
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:
| 参数 | 是否必需 | 描述 |
|---|---|---|
| dynamic_partition.enable | 否 | 启用动态分区。有效值为 TRUE 和 FALSE。默认值为 TRUE。 |
| dynamic_partition.time_unit | 是 | 动态创建分区的时间粒度。此参数为必需参数。有效值为 HOUR、DAY、WEEK、MONTH 和 YEAR。时间粒度决定了动态创建分区的后缀格式。
|