You need to enable JavaScript to run this app.
导航
StarRocks 分区表使用
最近更新时间:2024.05.06 15:59:08首次发布时间:2024.05.06 15:59:08

StarRocks 数据库的分区表是一种用于存储和管理大规模数据的表结构。它将一个大表拆分成多个小的分区,每个分区都包含了表数据的一部分。这些分区可以按照特定的规则进行划分,例如时间、地理位置、业务领域等。

分区表的优势包括:

  1. 提高查询性能:通过将大表拆分成多个分区,可以减少查询时需要扫描的数据量,从而提高查询性能。查询可以只扫描相关分区,而不是全表扫描。

  2. 数据管理更灵活:可以对不同分区进行独立的数据管理,例如备份、还原、索引维护等。可以更精细地控制数据的生命周期和维护过程。

  3. 可扩展性更好:随着数据量的增加,可以通过添加更多的分区来水平扩展表的存储能力,而不需要对整个表进行重构。

  4. 更好的数据局部性:分区表可以根据数据的特征将数据分布在不同的物理存储上,从而提高数据的局部性,减少 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分区

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。时间粒度会决定动态创建的分区名后缀格式。
取值为 HOUR 时,仅支持Datetime类型,动态创建的分区名后缀格式为 yyyyMMddHH,例如 2020032101。
取值为 DAY 时,动态创建的分区名后缀格式为 yyyyMMdd,例如 20200321。
取值为 WEEK 时,动态创建的分区名后缀格式为 yyyy_ww,例如 2020_13 代表 2020 年第 13 周。
取值为 MONTH 时,动态创建的分区名后缀格式为 yyyyMM,例如 202003。
取值为 YEAR 时,动态创建的分区名后缀格式为 yyyy,例如 2020。

dynamic_partition.time_zone动态分区的时区。默认与系统时区一致。

dynamic_partition.start

保留的动态分区的起始偏移,取值范围为负整数。根据 dynamic_partition.time_unit 属性的不同,以当天(周/月)为基准,分区范围在此偏移之前的分区将会被删除。比如设置为-3,并且dynamic_partition.time_unit为day,则表示 3 天前的分区会被删掉。
如果不填写,则默认为 Integer.MIN_VALUE,即 -2147483648,表示不删除历史分区。

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分区

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 分区的基表创建。