列表分片的 MODIFY 子句的示例

您可以使用 MODIFY 子句对按列表分片的表或索引的分片进行更改,包括以下更改:
  • 更改现有列表分片的名称
  • 将现有列表分片的存储位置移动到另一个 dbspace
  • 更改一个或多个列表分片的表达式
以下 ALTER FRAGMENT ON TABLE 语句更改了按列表分区的表的分片的名称、分片表达式列表和其存储位置:
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;
                  
上述语句对该分片及其存储分布具有以下影响:
  • 重新定义了 p2 分片的分片表达式,将其变为 NULL 分片,
  • 将此分片的名称更改为 newp2
  • 将此分片的存储位置从 dbs2 移动到 dbs5
  • 将存储在 p2 分片中的现有数据行移动到余项分片 p3 中,因为这些行的 c 列中的分片键值("PQ""RS")不符合新的 NULL 表达式。

如果启用自动更新分布统计信息,实现数据重分布 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 已经存在。

以下是对同一表的修改,它尝试将分片 p2 更改为一个重复的余项分片:
ALTER FRAGMENT ON TABLE tab MODIFY 
                              PARTITION p2 TO PARTITION p2 REMAINDER IN dbs2;

以上语句由于产生错误而失败,因为现有的分片 p4 已经定义为余项分片。

以下修改在两个分片中创建了一个重复的表达式列表值 "RS"
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 语句的示例