v3.1 起,StarRocks 支持 List 分区,数据按照您显式定义的枚举值列表进行分区,适用于按枚举值来查询和管理数据
功能:
需要显式列出每个 List 分区所包含的枚举值列表,并且值不需要连续,区别于包含连续日期或者数值范围的 Range 分区。当新数据导入表中时,StarRocks 会根据数据的分区列值与分区的映射关系将数据分配到相应的分区中
List 分区适用于存储具有少量枚举值列的数据、并且经常按列的枚举值来查询和管理数据的场景。例如表示地理位置、状态、类别的列。列的每个值都代表一种独立的类别。按照列的枚举值对数据进行分区,可以提高查询性能和方便数据管理,尤其适用于一个分区中需要包含各分区列的多个值的场景
语法
PARTITION BY LIST (partition_columns)(
PARTITION <partition_name> VALUES IN (value_list)
[, ...]
)
partition_columns::=
<column> [,<column> [, ...] ]
value_list ::=
value_item [, value_item [, ...] ]
value_item ::=
{ <value> | ( <value> [, <value>, [, ...] ] ) }
参数说明
partition_columns: 分区列
partition_name:分区名称
value_list: 分区中分区列的枚举值列表。
示例
假设经常按照州或城市查询机房收费明细,则建表时可以指定分区列为城市 city ,并且指定每个分区所包含城市同属一个州,这样可以加速查询特定州或城市的数据
CREATE TABLE t_recharge_detail2 (
id bigint,
user_id bigint,
recharge_money decimal(32,2),
city varchar(20) not null,
dt varchar(20) not null
)
DUPLICATE KEY(id)
PARTITION BY LIST (city) (
PARTITION pCalifornia VALUES IN ("Los Angeles","San Francisco","San Diego"), -- 这些城市同属一个州
PARTITION pTexas VALUES IN ("Houston","Dallas","Austin")
)
DISTRIBUTED BY HASH(`id`);
假设经常按日期范围和特定州或城市查询机房收费明细,则建表时可以指定分区列为日期 dt 和城市 city。这样属于特定日期和特定州或城市的数据分组到同一个分区中
CREATE TABLE t_recharge_detail4 (
id bigint,
user_id bigint,
recharge_money decimal(32,2),
city varchar(20) not null,
dt varchar(20) not null
) ENGINE=OLAP
DUPLICATE KEY(id)
PARTITION BY LIST (dt,city) (
PARTITION p202204_California VALUES IN (
("2022-04-01", "Los Angeles"),
("2022-04-01", "San Francisco"),
("2022-04-02", "Los Angeles"),
("2022-04-02", "San Francisco")
),
PARTITION p202204_Texas VALUES IN (
("2022-04-01", "Houston"),
("2022-04-01", "Dallas"),
("2022-04-02", "Houston"),
("2022-04-02", "Dallas")
)
)
DISTRIBUTED BY HASH(`id`);
使用限制
- 不支持动态和批量创建 List 分区。
- StarRocks 存算分离模式 从 3.1.1 版本开始支持该功能。
- 使用
ALTER TABLE <table_name> DROP PARTITION <partition_name>
;分区直接被删除并且不能被恢复。 - List 分区暂时不支持备份与恢复。
- 异步物化视图暂不支持基于使用 List 分区的基表创建。