表达式分区(推荐)
自 v3.0 起,StarRocks 支持表达式分区(此前称为自动分区),它更灵活、更易用。这种分区方法适用于大多数场景,例如基于连续时间范围或 ENUM 值查询和管理数据。
您只需在建表时指定一个简单的分区表达式。在数据加载期间,StarRocks 将根据数据和分区表达式中定义的规则自动创建分区。您不再需要在建表时手动创建大量分区,也不需要配置动态分区属性。
从 v3.4 起,表达式分区得到进一步优化,统一了所有分区策略并支持更复杂的解决方案。在大多数情况下推荐使用,并将在未来版本中取代其他分区策略。
从 v3.5 起,StarRocks 支持基于时间函数合并表达式分区,以优化存储效率和查询性能。有关详细信息,请参阅 合并表达式分区。
基于简单时间函数表达式的分区
如果您经常基于连续时间范围查询和管理数据,您只需指定一个日期类型(DATE 或 DATETIME)列作为分区列,并在时间函数表达式中指定年、月、日或小时作为分区粒度。StarRocks 将根据加载的数据和分区表达式自动创建分区,并设置分区的开始和结束日期或日期时间。
但是,在某些特殊场景下,例如将历史数据按月分区,将近期数据按天分区,您必须使用 范围分区 来创建分区。
PARTITION BY date_trunc(column) 和 PARTITION BY time_slice(column) 尽管是表达式分区的格式,但被视为范围分区。因此,您可以使用 ALTER TABLE ... ADD PARTITION 语句为使用此类分区策略的表添加新分区。
语法
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> [ , boundary ] ) }
参数
expression
必填:是
说明:一个简单的时间函数表达式,使用 date_trunc 或 time_slice 函数。如果您使用 time_slice 函数,则无需传递 boundary 参数。因为在这种情况下,此参数的默认有效值为 floor,且该值不能为 ceil。
time_unit
必填:是
说明:分区粒度,可以是 hour、day、week、month 或 year。如果分区粒度是 hour,则分区列必须是 DATETIME 数据类型,不能是 DATE 数据类型。
partition_column
必填:是
说明:分区列的名称。
- 分区列只能是
DATE或DATETIME数据类型。分区列允许NULL值。 - 如果使用
date_trunc函数,分区列可以 是DATE或DATETIME数据类型。如果使用time_slice函数,分区列必须是DATETIME数据类型。 - 如果分区列是
DATE数据类型,支持的范围是[0000-01-01 ~ 9999-12-31]。如果分区列是DATETIME数据类型,支持的范围是[0000-01-01 01:01:01 ~ 9999-12-31 23:59:59] - 目前,您只能指定一个分区列;不支持多个分区列。
partition_live_number
必填:否
说明:要保留的最新分区的数量。分区按时间顺序排序,以当前日期为基准;早于当前日期减去 partition_live_number 的分区将被删除。StarRocks 会调度任务来管理分区数量,调度间隔可以通过 FE 动态参数 dynamic_partition_check_interval_seconds 进行配置,默认为 600 秒(10 分钟)。假设当前日期是 2023 年 4 月 4 日,partition_live_number 设置为 2,并且分区包括 p20230401、p20230402、p20230403、p20230404。分区 p20230403 和 p20230404 将被保留,其他分区将被删除。如果加载了脏数据,例如来自未来日期 4 月 5 日和 4 月 6 日的数据,分区包括 p20230401、p20230402、p20230403、p20230404 和 p20230405,以及 p20230406。那么分区 p20230403、p20230404、p20230405 和 p20230406 将被保留,其他分区将被删除。
partition_retention_condition
从 v3.5.0 起,StarRocks 原生表支持通用分区表达式 TTL。
partition_retention_condition:声明要动态保留的分区的表达式。不满足表达式中条件的分区将定期被删除。示例:'partition_retention_condition' = 'dt >= CURRENT_DATE() - INTERVAL 3 MONTH'。
- 表达式只能包含分区列和常量。不支持非分区列。
- 通用分区表达式对列表分区和范围分区的应用方式不同:
- 对于列表分区表,StarRocks 支持删除通过通用分区表达式过滤的分区。
- 对于范围分区表,StarRocks 只能通过 FE 的分区裁剪能力来过滤和删除分区。与分区裁剪不支持的谓词对应的分区无法被过滤和删除。
使用说明
- 在数据加载过程中,StarRocks 会根据加载的数据自动创建一些分区,但如果加载作业因某种原因失败,StarRocks 自动创建的分区无法自动删除。
- StarRocks 将单次加载自动创建分区的默认最大数量设置为 4096,这可以通过 FE 参数
auto_partition_max_creation_number_per_load进行配置。此参数可以防止您意外创建过多分区。 - 分区的命名规则与动态分区的命名规则一致。