使用 ALTER FRAGMENT 语句的 INIT 子句的 FRAGMENT BY选项来分片现有未分片表,或将一个表分片策略转换为另一个。
本文中 PARTITION BY 关键字类似于 FRAGMENT BY 关键字。
约束 | 描述 | 限制 | 语法 |
---|---|---|---|
column | 该策略适用的列 | 必须存在于表中 | 标识符 |
dbspace | 包含表分片的 Dbspace | 必须指定至少 2 个但不超过 2,048 个 dbspaces | 标识符 |
expr | 定义表分片的表达式 | 必须求出一个 Boolean 值 (t 或 f) | 表达式 |
part | 分片的名称 | 同一 dbspace 中分片的名称必须作为同一表中另一分片的名称。同一表中的分片的名称必须唯一。 | 标识符 |
它可作为 CREATE TABLE 子句 FRAGMENT BY (或 PARTITION BY )子句的语法。有关表可用的分片策略的信息,请参阅 CREATE TABLE 中的 FRAGMENT BY 子句 。
这些示例的定义语句定义了一个现有表的范围区间分片策略。随后的 ALTER FRAGMENT 语句定义了范围区间策略的三个分片,包括非 NULL 分片,数值列 c1 是分片键:
ALTER FRAGMENT ON TABLE T1 INIT FRAGMENT BY RANGE(c1) INTERVAL (100+100) STORE IN (dbs3, dbs4, dbs5, dbs6, dbs7, dbs8) PARTITION part0 VALUES < 0 IN dbs0, PARTITION part1 VALUES < 1000 IN dbs1, PARTITION part2 VALUES < 2000 IN dbs2;
(100+100)的区间值表达式定义了列 c1 范围内区间分片的大小为 200 。如果当插入一个 c1 等于或大于2000 行时,这仍是其存储分布,那么数据库服务器会自动创建新的分片以存储行,超出现有分片范围。区间分区以轮循机制的方式存储在 dbs2 、dbs3 、dbs4 、 dbs5 、dbs6 、dbs7 和 dbs8 dbspace 中。
以下语句类似地定义了一个范围区间分片策略(包括非 NULL 分片和 DATE 或 DATETIME 列 c2 是分片键 i)的三个分片:
ALTER FRAGMENT ON TABLE T1 INIT FRAGMENT BY RANGE(c2) INTERVAL (NUMTOYMINTERVAL(1,'MONTH')) PARTITION part0 VALUES < DATE('01/01/2009') IN dbs0, PARTITION part1 VALUES < DATE('07/01/2009') IN dbs1, PARTITION part2 VALUES < DATE('01/01/2010') IN dbs2;
此处 NUMTOYMINTERVAL(1,'MONTH') 区间值表达式定义了在 c2 列的范围内的单个月作为区间分片大小。PARTITION 列表定义了三个分片:2008 年12月的 part0 、2008年七月的 part1 和 2009 年12月的 part2 f。如果要插入行的 c2 值不是这三个其中的月,数据库服务器会为这些行创建新的分片。因为 STORE IN 子句没有指定,数据库服务器将在 dbs0 、dbs1 和 dbs2 dbspace 中以轮循机制的方式存储这些范围区间分片,在三个 PARTITION 指定的 IN 关键字之后。