列表分区(旧版)
自 v3.1 起,StarRocks 支持列表分区。数据基于每个分区的预定义值列表进行分区,这可以加速查询并方便根据枚举值进行管理。
请注意,从 v3.4 开始,表达式分区得到了进一步优化,统一了所有分区策略,并支持更复杂的解决方案。在大多数情况下推荐使用表达式分区,它将在未来的版本中取代列表分区策略。
简介
您需要在每个分区中显式指定列值列表。这些值不需要是连续的,这与范围分区中所需的时间或数字范围连续不同。在数据加载期间,StarRocks 将根据数据的分区列值与每个分区的预定义列值之间的映射,将数据存储到相应的分区中。
列表分区适用于存储列包含少量枚举值的数据,并且您经常根据这些枚举值查询和管理数据。例如,列表示地理位置、州和类别。列中的每个值代表一个独立的类别。通过基于枚举值对数据进行分区,您可以提高查询性能并方便数据管理。
列表分区对于需要一个分区包含每个分区列的多个值的场景尤其有用。例如,如果一个表包含表示个人所在城市的 City
列,并且您经常按州和城市查询和管理数据。在创建表时,您可以将 City
列用作列表分区的分区列,并指定同一州内不同城市的数据放在一个分区中,例如 PARTITION pCalifornia VALUES IN ("Los Angeles", "San Francisco", "San Diego")
。此方法可以加速基于州和城市的查询,同时方便数据管理。
如果一个分区只需要包含每个分区列的相同值的数据,建议使用 表达式分区。
列表分区和 表达式分区 之间的比较
列表分区和表达式分区(推荐)之间的主要区别在于,列表分区需要您手动逐个创建分区。另一方面,表达式分区可以在加载期间自动创建分区,从而简化分区。并且在大多数情况下,表达式分区可以替代列表分区。两者之间的具体比较如下表所示
分区方法 | 列表分区 | 表达式分区 |
---|---|---|
语法 | PARTITION BY LIST (partition_columns)( PARTITION <partition_name> VALUES IN (value_list) [, ...] ) | PARTITION BY <partition_columns> |
分区中每个分区列的多个值 | 支持。一个分区可以存储每个分区列中具有不同值的数据。在以下示例中,当加载的数据在 city 列中包含值 Los Angeles 、San Francisco 和 San Diego 时,所有数据都存储在一个分区 pCalifornia 中。PARTITION BY LIST (city) ( PARTITION pCalifornia VALUES IN ("Los Angeles","San Francisco","San Diego") [, ...] ) | 不支持。一个分区存储分区列中具有相同值的数据。例如,表达式 PARTITION BY (city) 在表达式分区中使用。当加载的数据在 city 列中包含值 Los Angeles 、San Francisco 和 San Diego 时,StarRocks 将自动创建三个分区 pLosAngeles 、pSanFrancisco 和 pSanDiego 。这三个分区分别存储 city 列中具有值 Los Angeles 、San Francisco 和 San Diego 的数据。 |
在数据加载之前创建分区 | 支持。需要在创建表时创建分区。 | 无需这样做。可以在数据加载期间自动创建分区。 |
在数据加载期间自动创建列表分区 | 不支持。如果在数据加载期间不存在与数据对应的分区,则返回错误。 | 支持。如果在数据加载期间不存在与数据对应的分区,StarRocks 会自动创建分区来存储数据。每个分区只能包含分区列具有相同值的数据。 |
SHOW CREATE TABLE | 在 CREATE TABLE 语句中返回分区定义。 | 加载数据后,该语句返回在 CREATE TABLE 语句中使用的分区子句的结果,即 PARTITION BY (partition_columns) 。但是,返回的结果不显示任何自动创建的分区。如果需要查看自动创建的分区,请执行 SHOW PARTITIONS FROM <table_name> 。 |
用法
语法
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 | 是 | 分区列的名称。分区列值可以是字符串(不支持 BINARY)、日期或日期时间、整数和布尔值。从 v3.3.3 开始,分区列允许 NULL 值。 |
partition_name | 是 | 分区名称。建议根据业务场景设置适当的分区名称,以区分不同分区中的数据。 |
value_list | 是 | 分区中的分区列值列表。 |
示例
示例 1:假设您经常根据州或城市查询数据中心计费的详细信息。在创建表时,您可以指定分区列为 city
,并指定每个分区存储同一州内城市的数据。此方法可以加速对特定州或城市的查询并方便数据管理。
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
)
DUPLICATE KEY(id)
PARTITION BY LIST (city) (
PARTITION pLos_Angeles VALUES IN ("Los Angeles"),
PARTITION pSan_Francisco VALUES IN ("San Francisco")
)
DISTRIBUTED BY HASH(`id`);
示例 2:假设您经常根据时间范围和特定州或城市查询数据中心计费的详细信息。在创建表时,您可以指定分区列为 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`);