表的 FRAGMENT BY 子句

使用 ALTER FRAGMENT 语句的 INIT 子句的 FRAGMENT BY选项来分片现有未分片表,或将一个表分片策略转换为另一个。

本文中 PARTITION BY 关键字类似于 FRAGMENT BY 关键字。

表的 FRAGMENT BY 子句
分片列表

约束 描述 限制 语法
column 该策略适用的列 必须存在于表中 标识符
dbspace 包含表分片的 Dbspace 必须指定至少 2 个但不超过 2,048 个 dbspaces 标识符
expr 定义表分片的表达式 必须求出一个 Boolean 值 (tf) 表达式
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 行时,这仍是其存储分布,那么数据库服务器会自动创建新的分片以存储行,超出现有分片范围。区间分区以轮循机制的方式存储在 dbs2dbs3dbs4dbs5dbs6dbs7dbs8 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 子句没有指定,数据库服务器将在 dbs0dbs1dbs2 dbspace 中以轮循机制的方式存储这些范围区间分片,在三个 PARTITION 指定的 IN 关键字之后。

1 如果它被包含在内,则必须使用分片列表的最后一项
2 请参阅 Interval fragment 子句
3 请参阅 列表分片子句