StarRocks 数据库的分区表是一种用于存储和管理大规模数据的表结构。它将一个大表拆分成多个小的分区,每个分区都包含了表数据的一部分。这些分区可以按照特定的规则进行划分,例如时间、地理位置、业务领域等。
分区表的优势包括:
提高查询性能:通过将大表拆分成多个分区,可以减少查询时需要扫描的数据量,从而提高查询性能。查询可以只扫描相关分区,而不是全表扫描。
数据管理更灵活:可以对不同分区进行独立的数据管理,例如备份、还原、索引维护等。可以更精细地控制数据的生命周期和维护过程。
可扩展性更好:随着数据量的增加,可以通过添加更多的分区来水平扩展表的存储能力,而不需要对整个表进行重构。
更好的数据局部性:分区表可以根据数据的特征将数据分布在不同的物理存储上,从而提高数据的局部性,减少 I/O 开销。
StarRocks分区支持支持三种分区方式,表达式分区(推荐)、Range 分区 和 List 分区。
StarRocks 支持表达式分区,在建表时设置分区表达式(时间函数表达式或列表达式)。在数据导入时,StarRocks 会根据数据和分区表达式的定义规则自动创建分区,您无需在建表时预先手动/批量创建大量分区,或者配置动态分区属性。
PARTITION BY expression ... PROPERTIES( 'partition_live_number' = 'xxx' ) ]
expression目前仅支持date_trunc和time_slice函数。
CREATE TABLE tb_expression_partition ( event_day DATETIME NOT NULL, id INT, name VARCHAR(32) ) DUPLICATE KEY(event_day, id, name) PARTITION BY date_trunc('day', event_day) DISTRIBUTED BY HASH(event_day, id);
-- 插入数据 INSERT INTO tb_expression_partition VALUES ("2020-05-01 20:12:04",1,"name1");
Range 分区适用于简单且具有连续性的数据,如时间序列数据(日期或时间戳)或连续的数值数据。并且经常按照连续日期/数值范围,来查询和管理数据。
PARTITION BY RANGE (partition_columns)( PARTITION <partition_name> VALUES LESS THAN ("yyyy-hh-dd") | VALUES [('startValue'), ('endValue')) , [, ...] )
CREATE TABLE tb_static_partition( part DATE, id INT DEFAULT '10', name VARCHAR(100) ) UNIQUE KEY(part, id) PARTITION BY RANGE(part)( PARTITION p2020 VALUES [('2020-01-01'), ('2021-01-01')) ) DISTRIBUTED BY HASH(id);
动态分区支持根据当前时间自动创建/删除分区。免除手动创建和删除分区的麻烦。
创建动态分区时需要在PROPERTIES中指定以下属性:
PROPERTIES( "dynamic_partition.enable" = "true", "dynamic_partition.time_unit" = "xxx", "dynamic_partition.start" = "xxx", "dynamic_partition.end" = "xxx", "dynamic_partition.prefix" = "xxx", "dynamic_partition.history_partition_num" = "xxx" );
参数 | 是否必填 | 说明 |
---|---|---|
dynamic_partition.enable | 否 | 开启动态分区特性,取值为 true(默认)或 false。 |
dynamic_partition.time_unit | 是 | 动态分区的时间粒度,取值为 HOUR、DAY、WEEK、MONTH 或 YEAR。时间粒度会决定动态创建的分区名后缀格式。 |
dynamic_partition.time_zone | 否 | 动态分区的时区。默认与系统时区一致。 |
dynamic_partition.start | 否 | 保留的动态分区的起始偏移,取值范围为负整数。根据 dynamic_partition.time_unit 属性的不同,以当天(周/月)为基准,分区范围在此偏移之前的分区将会被删除。比如设置为-3,并且dynamic_partition.time_unit为day,则表示 3 天前的分区会被删掉。 |
dynamic_partition.end | 是 | 提前创建的分区数量,取值范围为正整数。根据 dynamic_partition.time_unit 属性的不同,以当天(周/月)为基准,提前创建对应范围的分区。 |
dynamic_partition.prefix | 否 | 动态分区的前缀名,默认值为 p。 |
dynamic_partition.buckets | 否 | 动态分区的分桶数量。默认与 BUCKETS 保留字指定的分桶数量、或者 StarRocks 自动设置的分桶数量保持一致。 |
dynamic_partition.history_partition_num | 否 | 动态分区的创建历史分区的个数,默认值为 0。当值>0时会提前创建历史分区。自 2.5.2 版本起,StarRocks 支持配置该参数。 |
dynamic_partition.start_day_of_week | 否 | 当 dynamic_partition.time_unit 为 WEEK 时,该参数指定每周的第一天。有效值为 1 到 7。1 表示星期一,7 表示星期日。默认值为 1,表示每周从星期一开始。 |
dynamic_partition.start_day_of_month | 否 | 当 dynamic_partition.time_unit 为 MONTH 时,该参数指定每月的第一天。有效值为 1 到 28。1 表示每月的第一天,28 表示每月的第 28 天。默认值为 1,表示每月从第一天开始。每月的第一天不支持为 29 日、30 日或 31 日。 |
dynamic_partition.replication_num | 否 | 在动态创建的分区中,每个 tablet 副本的数量。默认值与建表时配置的副本数量相同。 |
CREATE TABLE tb_dynamic_partition( part DATE, id INT DEFAULT '10', name VARCHAR(100) ) UNIQUE KEY(part, id) PARTITION BY RANGE(part)( PARTITION p2020 VALUES [('2020-01-01'), ('2021-01-01')) ) DISTRIBUTED BY HASH(id) PROPERTIES( "dynamic_partition.enable" = "true", "dynamic_partition.time_unit" = "DAY", "dynamic_partition.start" = "-10", "dynamic_partition.end" = "3", "dynamic_partition.prefix" = "p", "dynamic_partition.history_partition_num" = "10" );
ALTER TABLE tb_demo SET("dynamic_partition.history_partition_num"="100");
List 分区适用于存储具有少量枚举值列的数据、并且经常按列的枚举值来查询和管理数据的场景。例如表示地理位置、状态、类别的列。列的每个值都代表一种独立的类别。按照列的枚举值对数据进行分区,可以提高查询性能和方便数据管理。
PARTITION BY LIST (partition_columns)( PARTITION <partition_name> VALUES IN (value_list) [, ...] )
设置city在Beijing, Tianjin的为北方分区,Guangzhou, Shenzhen的为南方分区。
CREATE TABLE tb_list_partition ( city bigint, id bigint, name varchar(20) not null ) DUPLICATE KEY(id) PARTITION BY LIST (part) ( PARTITION pNorth VALUES IN ("Beijing","Tianjin"), PARTITION pSouth VALUES IN ("Shenzhen","Guangzhou") ) DISTRIBUTED BY HASH(`id`);
不支持动态和批量创建 List 分区。
StarRocks 存算分离模式从 3.1.1 版本开始支持该功能。
使用 ALTER TABLE <table_name> DROP PARTITION <partition_name>;
分区直接被删除并且不能被恢复。
List 分区暂时不支持备份与恢复。
异步物化视图暂不支持基于使用 List 分区的基表创建。