ALTER FRAGMENT ON TABLE T2 MODIFY PARTITION part1 TO PARTITION part11 VALUES ('CA', 'OR', 'TX') IN dbs1;这里将分片名称 part1 更改为 part11,将值 'TX' 添加到此分片的表达式的列表中,并且将已命名的分片移动到 dbspace dbs1 中。
以下示例说明了带有列表分片方案的 MODIFYE 子句的这些和其它用途,也说明了由于列表分片的逻辑限制会使 MODIFY 操作失败。
假设该 CREATE TABLE 语句定义了以下结构的表 myTable ,且此表有列表分片策略:
CREATE TABLE myTable (i int, c char(2)) FRAGMENT BY LIST (c) PARTITION p1 VALUES ("AB", "CD") IN dbs1, PARTITION p2 VALUES ("PQ", "RS") IN dbs2, PARTITION p3 REMAINDER IN dbs3;
下一 ALTER FRAGMENT 语句修改了 p2 分片的存储分片策略:
ALTER FRAGMENT ON TABLE myTable MODIFY PARTITION p2 TO PARTITION newp2 VALUES (NULL) IN dbs5;上述语句对该分片及其存储分布具有以下影响:
如果启用自动更新分布统计信息,实现数据重分布 ALTER FRAGMENT . . . MODIFY 的语句会导致受影响的分片的分片级别统计信息将会删除。然而,表级别的统计信息不会被删除。因为该影响的分片没有分片级别的统计信息,下一个在此表中显式或自动 UPDATE STATISTICS 操作将重建分片级别分布,并将结果存储到系统目录中。
ALTER FRAGMENT 语句指定的修改都基于 tab 表分片,该 CREATE TABLE 语句定义了列表分布方案:
CREATE TABLE tab (i int, c char(2)) FRAGMENT BY LIST (c) PARTITION p1 VALUES ("AB", "CD") IN dbs1, PARTITION p2 VALUES ("PQ", "RS") IN dbs2, PARTITION p3 VALUES (NULL) IN dbs3, PARTITION p4 REMAINDER IN dbs4;
下列语句修改了分片 p1 的分片表达式:
ALTER FRAGMENT ON TABLE tab MODIFY PARTITION p1 TO PARTITION p1 VALUES ("AB", "CD", "EF") IN dbs1;
下列语句修改了分片 p3 的分片表达式:
ALTER FRAGMENT ON TABLE tab MODIFY PARTITION p3 TO PARTITION p3 VALUES ("XX", "YY", "ZZ") IN dbs3;
出于各种原因,ALTER FRAGMENT ON TABLE MODIFY 操作的结果:没有行可以移动到新分片中,并返回了错误,如下所示:
ALTER FRAGMENT ON TABLE tab MODIFY PARTITION p3 TO PARTITION p3 VALUES ("XX", "YY", "ZZ") IN dbs3;
修改后,tab 表生成的存储分布方案会有以下分片:
PARTITION p1 VALUES ("AB", "CD") IN dbs1, PARTITION p2 VALUES ("PQ", "RS") IN dbs2, PARTITION p3 VALUES ("XX", "YY", "ZZ") IN dbs2
如果之前的余项分片 p3 在列 c 中有一值为 "AA" 的行,那么那一行不适合新分片策略中的任何分片。当尝试从余项分片移动行时,以上的 ALTER FRAGMENT 语句会由于错误而失败。
以下三个示例说明了同一表分片策略的更改会因为重叠而失败。
ALTER FRAGMENT ON TABLE tab MODIFY PARTITION p2 TO PARTITION p2 VALUES (NULL) IN dbs2;
因为以上的 ALTER FRAGMENT 语句尝试将分片 p2 更改为一个重复的 NULL 分片,该语句由于产生错误而失败,因为 NULL 分片 p3 已经存在。
ALTER FRAGMENT ON TABLE tab MODIFY PARTITION p2 TO PARTITION p2 REMAINDER IN dbs2;
以上语句由于产生错误而失败,因为现有的分片 p4 已经定义为余项分片。
ALTER FRAGMENT ON TABLE tab MODIFY PARTITION p1 TO PARTITION p1 VALUES ("AB", "CD", "RS") IN dbs1;
由于在 p2 分片的表达式列表中已经定义了列表值 "RS" ,上述语句由于此错误而失败。
有关使用 ALTER FRAGMENT ON INDEX 语句的 MODIFY 选项的示例,请参阅 ALTER FRAGMENT ON INDEX 语句的示例。