ITPub博客

首页 > 数据库 > 国内数据库 > 南大通用GBase8s SQL常用SQL语句(十二)

南大通用GBase8s SQL常用SQL语句(十二)

原创 国内数据库 作者:飞天小气球 时间:2021-09-23 09:45:33 0 删除 编辑

南大通用GBase8s SQL 常用 SQL 语句( 十二

列表分片的 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 语句的示例

ALTER FRAGMENT ON INDEX 语句的示例

以下一系列的示例阐述了 ALTER FRAGMENT ON INDEX INIT ADD DROP MODIFY 选项。

第一个示例创建了一个存储于 dbsp1   中的索引:

CREATE INDEX item_idx ON items (stock_num) IN dbsp1;

以下语句修改此索引以添加分片。值超过 50 的存储在 dbsp1 、值在 51 80 之间的存储于 dbsp2   ,剩余的存储于 dbsp3

ALTER FRAGMENT ON INDEX item_idx INIT

        FRAGMENT BY EXPRESSION

        stock_num <= 50 IN dbsp1,

        stock_num > 50 AND stock_num <= 80 IN dbsp2,

        REMAINDER IN dbsp3;

以下语句向该索引中添加了一个新的分片:

ALTER FRAGMENT ON INDEX item_idx

        ADD stock_num > 80 AND stock_num <= 120 IN dbsp4;

以下语句更改了此索引的第一个分片:

ALTER FRAGMENT ON INDEX item_idx

        MODIFY dbsp1 TO stock_num <= 40 IN dbsp1;

以下语句删除了该索引 dbsp4   中的分片:

ALTER FRAGMENT ON INDEX item_idx

        DROP dbsp4;

以下语句定义了一个按表达式分片的索引,其分片存储于dbspaces dbsp1   dbsp2   的命名的分片中:

ALTER FRAGMENT ON INDEX item_idx INIT

        PARTITION BY EXPRESSION

        PARTITION part1 stock_num <= 10 IN dbsp1,

        PARTITION part2 stock_num > 20 AND stock_num <= 30 IN dbsp1,

        PARTITION part3 REMAINDER IN dbsp2;

以下语句添加了一个新的命名的分片:

ALTER FRAGMENT ON INDEX item_idx ADD

          PARTITION part4 stock_num > 30 AND stock_num <= 40 IN dbsp2

          BEFORE part3;

以下语句在索引 idx1   上定义了范围区间存储分布方案:

ALTER FRAGMENT ON INDEX idx2 INIT

        FRAGMENT BY RANGE(c2)

        INTERVAL (NUMTOYMINTERVAL(1,'MONTH')

        PARTITION part0 VALUES <  DATE('01/01/2007') IN dbs0,

        PARTITION part1 VALUES <  DATE('07/01/2007') IN dbs1,

        PARTITION part2 VALUES <  DATE('01/01/2008') IN dbs2

上述示例中,

分片键是列 c2   的值,

间隔值是一个月,

因为不包含 STORE IN 子句,新的系统生成的区间分区将轮流存储在 dbs0   dbs1   dbs2   中;

区间分片过渡值是 01/01/2008 。(这是超过最后一个用户定义分片的范围的最小值)

以下语句在索引 idx2   上定义了一个列表存储分布方案:

ALTER FRAGMENT ON INDEX idx2 INIT

FRAGMENT BY LIST(state)

   PARTITION part0 VALUES ('KS','IL') IN dbs0,

   PARTITION part1 VALUES ('CA','OR') IN dbs0,

   PARTITION part2 VALUES (NULL) IN dbs1,

   PARTITION part3 REMAINDER IN dbs2;

在以上列表分片示例中,

分片键是列 state   的值,

头两个分片的表达式列表是分别是两个 state 的邮政缩写字符串,

定义的行的 NULL 分片( part2 )和余项分片( part3 )的分片键值都不符合头两个表达式列表。

 

官网:

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/70002567/viewspace-2793171/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2021-06-23

  • 博文量
    15
  • 访问量
    5692