创建和管理分区表
本文档概述了如何在 Apache Cloudberry 中使用推荐的语法创建和维护分区表。
有关分区表的更多信息,请参阅关于表分区。
创建分区表
在创建分区表之前,您应该:
- 选择分区方法:范围、列表或哈希。
- 选择分区键的列。
- 确定适当的分区数量和级别(如果使用多级分区)。
- 创建分区表。
- 创建单独的分区。
Apache Cloudberry 会自动创建描述分区边界条件的约束。任何插入到根分区表中的数据,只要符合某个分区的约束,就会被定向到该分区。
对于子分区,如有必要,可以使用相同的分区键列(例如,按月分区,然后按天子分区)。考虑直接按最细粒度级别进行分区(例如,365 个每日分区,而不是按年、月、天),因为扁平分区设计通常运行更快,尽管多级设计可以减少查询规划时间。
定义日期范围分区表
日期范围分区表使用 date
或 timestamp
列作为分区键。您可以为范围分区表指定多个分区键列。
示例:为一家冰淇淋公司创建一个 measurement
表,按 logdate
列按月分区,以保留两年的数据并每月删除最旧月份的数据。
-
创建根分区表:
CREATE TABLE measurement (
city_id int not null,
logdate date not null,
peaktemp int,
unitsales int
)
DISTRIBUTED BY (city_id)
PARTITION BY RANGE (logdate); -
创建分区(例如,每个月):
CREATE TABLE measurement_y2021m01 PARTITION OF measurement
FOR VALUES FROM ('2021-01-01') TO ('2021-02-01');
CREATE TABLE measurement_y2021m02 PARTITION OF measurement
FOR VALUES FROM ('2021-02-01') TO ('2021-03-01');
-- ... 其他月份以此类推 ...
CREATE TABLE measurement_y2022m12 PARTITION OF measurement
FOR VALUES FROM ('2022-12-01') TO ('2023-01-01') -- 注意:原文此处可能为笔误,应为 '2023-01-01'
TABLESPACE fasttablespace;
CREATE TABLE measurement_y2023m01 PARTITION OF measurement
FOR VALUES FROM ('2023-01-01') TO ('2023-02-01')
WITH (parallel_workers = 4)
TABLESPACE fasttablespace;范围上限被视为独占。如果插入到父表中的数据没有映射到现有分区,Apache Cloudberry 将返回错误(除非存在默认分区)。
定义数字范围分区表
此类分区表使用数字类型的列作为分区键。支持多个分区键列。
示例:创建按 year
分区的 numpart
表。
-
创建根分区表:
CREATE TABLE numpart (id int, rank int, year int, color char(1), count int)
DISTRIBUTED BY (id)
PARTITION BY RANGE (year); -
创建分区:
CREATE TABLE numpart_y2019 PARTITION OF numpart FOR VALUES FROM (2019) TO (2020);
CREATE TABLE numpart_y2020 PARTITION OF numpart FOR VALUES FROM (2020) TO (2021);
CREATE TABLE numpart_y2021 PARTITION OF numpart FOR VALUES FROM (2021) TO (2022);
CREATE TABLE numpart_y2022 PARTITION OF numpart FOR VALUES FROM (2022) TO (2023);
定义列表分区表
列表分区表可以使用任何允许相等比较的数据类型列作为其分区键。列表分区只允许单个列作为分区键。您必须为每个列表值声明一个分区规范。
示例:创建按 color
分区的 listpart
表。
-
创建根分区表:
CREATE TABLE listpart (id int, rank int, year int, color char(1), count int)
DISTRIBUTED BY (id)
PARTITION BY LIST (color); -
创建分区:
CREATE TABLE listpart_red PARTITION OF listpart FOR VALUES IN ('r');
CREATE TABLE listpart_green PARTITION OF listpart FOR VALUES IN ('g');
CREATE TABLE listpart_blue PARTITION OF listpart FOR VALUES IN ('b');
CREATE TABLE listpart_other PARTITION OF listpart DEFAULT;DEFAULT
关键字会创建一个默认分区,用于捕获不匹配其他分区的任何数据。