StarRocks表达式分区技术详解
概述
表达式分区是StarRocks从3.0版本开始引入的一种灵活且用户友好的数据分区方式,特别适合基于连续时间范围或枚举值进行数据查询和管理的场景。本文将深入解析StarRocks表达式分区的技术原理、使用方法和最佳实践。
表达式分区核心优势
相比传统分区方式,表达式分区具有以下显著优势:
- 自动化管理:无需手动创建大量分区,系统根据数据自动创建
- 灵活配置:支持基于时间函数和列表达式的多种分区策略
- 生命周期管理:可配置分区保留策略,自动清理过期数据
- 查询优化:支持高效的分区裁剪,显著提升查询性能
基于时间函数的分区
基本语法
PARTITION BY expression
[PROPERTIES({'partition_live_number'='xxx'|'partition_retention_condition'='expr'})]
expression ::=
{date_trunc(<time_unit>,<partition_column>)|
time_slice(<partition_column>,INTERVAL <N> <time_unit>)}
关键参数解析
-
时间单位(time_unit):
- 支持:hour/day/month/year
- 注意:week粒度暂不支持
- 小时粒度要求分区列必须为DATETIME类型
-
分区列(partition_column):
- 数据类型:DATE或DATETIME
- 支持NULL值
- 范围限制:
- DATE:0000-01-01 ~ 9999-12-31
- DATETIME:0000-01-01 01:01:01 ~ 9999-12-31 23:59:59
-
生命周期管理:
partition_live_number:保留最近N个分区partition_retention_condition:基于表达式的保留条件(3.5+)
实际应用示例
按天分区场景
CREATE TABLE site_access1 (
event_day DATETIME NOT NULL,
site_id INT DEFAULT '10',
city_code VARCHAR(100),
user_name VARCHAR(32) DEFAULT '',
pv BIGINT DEFAULT '0'
)
PARTITION BY date_trunc('day', event_day);
插入数据后,系统会自动创建对应日期的分区:
p20230226:范围[2023-02-26 00:00:00, 2023-02-27 00:00:00)p20230227:范围[2023-02-27 00:00:00, 2023-02-28 00:00:00)
按月分区+保留策略
CREATE TABLE site_access2 (
event_day DATETIME NOT NULL,
site_id INT DEFAULT '10',
city_code VARCHAR(100),
user_name VARCHAR(32) DEFAULT '',
pv BIGINT DEFAULT '0'
)
PARTITION BY date_trunc('month', event_day)
PROPERTIES("partition_live_number"="3");
此配置仅保留最近3个月的分区,历史分区会自动清理。
基于列表达式的分区(3.1+)
语法结构
PARTITION BY partition_columns
partition_columns ::= <column>[, <column>[,...]]
适用场景
适合按特定类型值(如城市、用户类别等)进行数据查询和管理的场景。
典型示例
CREATE TABLE t_recharge_detail1 (
id bigint,
user_id bigint,
recharge_money decimal(32,2),
city varchar(20) not null,
dt varchar(20) not null
)
PARTITION BY dt,city;
插入数据后,系统会创建形如p20220401_Houston的分区,其中:
- 分区名格式:
p<值1>_<值2>_... - 每个分区仅包含指定值的记录
复杂时间函数分区(3.4+)
新增能力
支持任意返回DATE/DATETIME类型的表达式,包括:
- Unix时间戳转换
- 字符串日期解析
- 复杂日期计算
实用案例
Unix时间戳分区
CREATE TABLE orders (
ts BIGINT NOT NULL,
id BIGINT NOT NULL,
city STRING NOT NULL
)
PARTITION BY from_unixtime(ts,'%Y%m%d');
整型时间戳转换分区
CREATE TABLE orders_new (
ts INT NOT NULL,
id BIGINT NOT NULL,
city STRING NOT NULL
)
PARTITION BY date_trunc('month', str_to_date(CAST(ts as STRING),'%Y%m%d'));
分区合并功能(3.5+)
核心价值
通过合并历史小分区,实现:
- 减少分区数量,降低元数据压力
- 优化存储效率
- 提升查询性能
实现原理
基于时间函数自动将满足条件的小分区合并为大分区,例如将历史日分区合并为月分区。
最佳实践建议
-
分区列选择:
- 优先选择查询条件中频繁使用的列
- 考虑数据的自然时间属性
-
分区粒度:
- 热数据:细粒度(如按天)
- 冷数据:粗粒度(如按月/年)
-
生命周期管理:
- 根据业务需求合理设置保留策略
- 定期监控分区数量增长
-
性能调优:
- 避免创建过多小分区
- 利用分区裁剪优化查询
-
异常处理:
- 注意失败作业可能遗留的临时分区
- 监控自动分区创建数量上限
注意事项
- 自动创建的分区在作业失败时不会自动清理
- 单次加载默认最多创建4096个分区(可配置)
- 复杂表达式分区需确保分区裁剪有效
- 从3.0到3.4版本的功能演进路径
通过合理使用表达式分区,可以显著简化StarRocks的数据管理复杂度,同时获得优异的查询性能。建议新项目优先采用表达式分区方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



