水平分区包括范围分区、哈希分区和列表分区三种。水平分区表的创建需要通过
<PARTITION 子句>指定。
范围(RANGE)分区,按照分区列的数据范围,确定实际数据存放位置的划分方式。
列表(LIST)分区,通过指定表中的某一个列的离散值集,来确定应当存储在一起的
数据。范围分区是按照某个列上的数据范围进行分区的,如果某个列上的数据无法通过划分
范围的方法进行分区,并且该列上的数据是相对固定的一些值,可以考虑使用 LIST 分区。
一般来说,对于数字型或者日期型的数据,适合采用范围分区的方法;而对于字符型数据,
取值比较固定的,则适合于采用 LIST 分区的方法。
哈希(HASH)分区,对分区列值进行 HASH 运算后,确定实际数据存放位置的划分方
式,主要用来确保数据在预先确定数目的分区中平均分布,允许只建立一个 HASH 分区。在
很多情况下,用户无法预测某个列上的数据变化范围,因而无法实现创建固定数量的范围分
区或 LIST 分区。在这种情况下,DM 哈希分区提供了一种在指定数量的分区中均等地划分
数据的方法, 基于分区键的散列值(HASH 值)将行映射到分区中。当用户向表中写入数
据时,数据库服务器将根据一个哈希函数对数据进行计算,把数据均匀地分布在各个分区中。
在哈希分区中,用户无法预测数据将被写入哪个分区中。
在很多情况下,经过一次分区并不能精确地对数据进行分类,这时需要多级分区表。在
进行多级分区的时候,三种分区类型还可以交叉使用。
例子:
CREATE TABLE "your_table_name"
("id" INT NOT NULL,"date_column" DATE NOT NULL,... -- 其他字段定义
)
PARTITION BY RANGE(DATE_COLUMN) -- 指定分区键为date_column
(PARTITION p0 VALUES LESS THAN ('2020-01-01'), -- 小于2020年1月1日的数据PARTITION p1 VALUES LESS THAN ('2021-01-01'), -- 2020年1月1日到2021年1月1日之间的数据PARTITION p2 VALUES LESS THAN ('2022-01-01'), -- 2021年1月1日到2022年1月1日之间的数据... -- 可以根据需要定义更多的分区PARTITION pn VALUES LESS THAN (MAXVALUE) -- 大于或等于最后一个范围上限的数据
);
使用说明
1. <表名>指定所要建立的基表名;
2. <PARTITION 子句>用来指定水平分区。其中 RANGE 和 HASH 可以指定一个或多
个列作为分区列,LIST 只能指定一个列作为分区列;
1) “PARTITION BY RANGE……”子句用来指定范围分区,然后在每个分区中分
区列的取值通过 VALUES 子句指定。
2) “PARTITION BY LIST……”子句用来指定 LIST 分区,然后在每个分区中分
区列的取值通过 VALUES 子句指定。当用户向表插入数据时,只要分区列的
数据与 VALUES 子句指定的数据之一相等,该行数据便会写入相应的分区子
表中。LIST 分区的分区范围值必须唯一,不能重复。
3) “PARTITION BY HASH……”子句用来指定 HASH 分区。
3. 分区列类型必须是数值型、字符型或日期型,不支持 BLOB、CLOB、IMAGE、TEXT、
LONGVARCHAR、BIT、BINARY、VARBINARY、LONGVARBINARY、BFILE、时间间隔类
型、虚拟列和用户自定义类型为分区列;
4. 水平分区表指定主键和唯一约束时,分区键必须都包含在主键和唯一约束中,但是
全局唯一索引不受此约束;
5. 不能在水平分区表上建立自引用约束;
6. 普通环境中,水平分区表的各级分区数的总和上限是 65535;MPP 环境下,水平
分区 表 的 各 级 分 区 总 数 上 限 取 决 于 INI 参数 MAX_EP_SITES ,上 限 为 2(16 -
log2MAX_EP_SITES)。比如:当 MAX_EP_SITES 为默认值 64 时,分区总数上限为 1024;
7. 可以定义主表的 BRANCH 选项,但不能对水平分区子表进行 BRANCH 项设置,子
表的 BRANCH 项只能通过主表继承得到;
8. 水平分区表不支持自增列;
9. 不允许引用水平分区子表作为外键约束;
10. 水平分区子表删除后,会将子表上的数据一起删除;
11. 范围分区和哈希分区的分区键可以多个,最多不超过 16 列;LIST 分区的分区键
必须唯一;
12. 范围分区表使用说明:
1) 范围分区支持 MAXVALUE 值的使用,MAXVALUE 代表一个比任何值都大的值。
MAXVALUE 值需要用户指定才能使用,作为分区中的最大值。
2) 范围分区的范围值表达式类型应与分区列类型一致,否则按分区列类型进行类
型转换。
3) 对于范围分区,增加分区必须在最后一个分区范围值的后面添加,要想在表的
开始范围或中间增加分区,应使用 SPLIT PARTITION 语句。
13. LIST 分区表使用说明:
1) LIST 分区支持 DEFAULT 关键字的使用,所有不满足分区条件的数据,都划
分为 DEFAULT 的分区,但 DEFAULT 关键字需要用户指定,系统不会自动创
建 DEFAULT 分区。
2) LIST 水平分区表为堆表时,其各子表必须位于同一个表空间。
3) LIST 分区范围值不能为 NULL。
4) LIST 分区子表范围值个数与数据页大小和相关系统表列长度相关,存在以下
限制:
a) 4K 页,单个子表最多支持 120 个范围值。
b) 8K 页,单个子表最多支持 254 个范围值。
c) 16K 或 32K 页,单个子表最多支持 270 个范围值。
14. 组合水平分区表层次最多支持八层;
15. 普通表、堆表、列存储表均支持多级分区。
特别注意第八项:水平分区表不支持自增列;