ITPub博客

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

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

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

带有区间分片的 MODIFY 子句的示例

本节阐述了对使用范围和区间分片作为其分布策略的表使用 ALTER FRAGMENT 语句的 MODIFY 子句的语法的功能和 MODIFY 子句可更改内容的限制。

有关按列表分片的表使用 MODIFY 子句的类似的示例,请参阅 列表分片的 MODIFY 子句的示例  

启用或禁用范围区间分片

此语句禁用范围区间分片的创建:

ALTER FRAGMENT ON TABLE tab MODIFY INTERVAL DISABLED;

以下语句恢复范围区间分片的创建,撤销了前一个例子的作用:

ALTER FRAGMENT ON TABLE tab MODIFY INTERVAL ENABLED;

以下语句禁用范围区间分片创建,并修改了 dbspace 列表(在 STORE IN 语句中表明了存储新分片的 dbspace )。如果随后的 ALTER FRAGMENT MODIFY 语句启用了 tab   表的范围区间分片创建功能。

ALTER FRAGMENT ON TABLE tab MODIFY INTERVAL DISABLED

        STORE IN (dbs4, dbs5);

在范围区间分片中重命名分片

此语句重命名两个范围区间分片。没有指定新存储位置的 IN 子句,因此两个分片新的名称替代了现有的名称:

ALTER FRAGMENT ON TABLE tab MODIFY

        PARTITION p1 TO PARTITION newp1,

        PARTITION sys_p6 TO PARTITION newsys_p6;

范围区间分片需要 PARTITION 关键字。如果您使用 MODIFY 子句重命名现有的分片,那么在 MODIFY 子句中声明的新的名称不能以字符串 sys   开头(该字符串用于系统定义的分片), 以上示例成功地重命名了系统定义的分片 sys_p6  

重新定位范围或区间分片

假设下表有范围区间分片并接收了来自插入操作的两行:

CREATE TABLE tab2 (i INT, c CHAR(2))

          FRAGMENT BY RANGE (i)

          INTERVAL (100) STORE IN (dbs1, dbs2, dbs3)

          PARTITION p0 VALUES < 100 IN dbs0,

          PARTITION p1 VALUES < 200 IN dbs1;

          

          INSERT INTO tab2 VALUES (201, "AA");  

          -- creates a system-generated interval fragment sys_p2

          -- with fragment expression >= 200 AND < 300

          -- assume that this fragment is created in dbs1

          

          INSERT INTO tab2 VALUES (601, "BB");  

          -- creates a system-generated interval fragment sys_p6

          -- with fragment expression >= 600 AND < 700

          ---assume that this fragment is created in dbs2

以下语句标示了数据库服务器将范围分片 p1   dbs1   移动到 dbs2

ALTER FRAGMENT ON TABLE tab2 MODIFY

          PARTITION p1 TO PARTITION p1 IN dbs2;

下一示例将范围分片 p1   dbs1   移动到 dbs2   并将区间分片 sys_p6   dbs2   移动到 dbs3

ALTER FRAGMENT ON TABLE tab2 MODIFY

        PARTITION p1 TO PARTITION p1 IN dbs2,

        PARTITION sys_p6 TO PARTITION sys_p6 IN dbs3;

替换存储新区间分片的 dbspace 列表

以下 CREATE TABLE 语句定义了一个范围区间分片策略,其中:

i   是分片键,

100 是范围区间的大小,

新分片将存储在 dbspace dbs1   dbs2   dbs3  

初始分片 p0 (在 dbspace dbs0   中), p1   (在 dbspace dbs1   中)的过渡值分别为 100   200

CREATE TABLE tab (i INT, c CHAR(2))

              FRAGMENT BY RANGE (i)

              INTERVAL (100) STORE IN (dbs1, dbs2, dbs3)

              PARTITION p0 VALUES < 100 IN dbs0,

              PARTITION p1 VALUES < 200 IN dbs1;

下列 ALTER FRAGMENT 语句在 STORE IN 中用新的列表 ( dbs4   dbs5 )替换了列表( dbs1   dbs2   dbs3 )。

ALTER FRAGMENT ON TABLE tab

        MODIFY INTERVAL STORE IN (dbs4, dbs5);

上个示例中,MODIFY 子句指定了新的分片将会轮流创建于 dbs4   dbs5   中。任何创建在最初 STORE IN 列的 dbspace dbs1   dbs2   dbs3 中的系统定义的分片(和分片 p1 仍保留在这些 dbspace 中。现有的和随插入行之后的分片键在这些分片范围区间内的分片仍将继续存储在这些分片中,但是将会创建新的区间分片,轮流地存储于 dbs4   dbs5  dbspace 中。

考虑以下分片表:

CREATE TABLE mytab (col1 int)

          FRAGMENT BY RANGE (c1) INTERVAL (100)

          STORE IN (dbs1, dbs2, dbs3, dbs4, dbs5)

          PARTITION p1 VALUES < 300 in dbs0;

ALTER FRAGMENT 语句替换了存储新区间分片的 dbspace 列表:

ALTER FRAGMENT ON TABLE mytab MODIFY

          STORE IN (dbs1, dbs6, dbs3, dbs4, dbs8);

新的列表用 dbs6   代替了 dbs2   dbs8   替换了 dbs5 。如果您希望来自当前 STORE IN 列表的任何 dbspace 可用于新的分片,那么 MODIFY 子句必须在新的列表(在已修改的分片存储方案中替换了旧的列表)中包含它们。在上述示例中,新区间分片将在 STORE IN 关键字之后列出的五个 dbspace 中创建 ,但是任何创建于 dbs2   dbs5   中的现有的分片将继续存储数据值符合分片键值范围的分片的行。

您可以在 STORE IN 子句中修改 dbspace 的列表。旧的列表会被您指定的新的列表所替换。不会移动旧的 dbspace 中的分片。考虑下表:

您可以通过更改该分片的 IN dbspace   规范而将现有分片移动到另一个 dbspace

CREATE TABLE tab (i INT, c CHAR(2))     

        FRAGMENT BY RANGE (i)      

        INTERVAL (100) STORE IN (dbs1, dbs2, dbs3)

        PARTITION p0 VALUES < 100 IN dbs0,      

        PARTITION p1 VALUES < 200 IN dbs1;   

        

        INSERT INTO tab VALUES (201, "AA");  

        -- creates interval fragment sys_p2

        -- with fragment expression >= 200 AND < 300

        -- (assume that this fragment is created in dbs1)

        INSERT INTO tab VALUES (601, "BB");  

        -- creates interval fragment sys_p6

        -- with fragment expression >= 600 AND < 700

        -- (assume that this fragment is created in dbs2)

下一个语句指示数据库服务器将分片 p1   dbs1   移动到 dbs2  

ALTER FRAGMENT ON TABLE tab MODIFY

          PARTITION p1 TO PARTITION p1 IN dbs2;

以下示例将范围分片 p1   dbs1   移动到 dbs2   ,并将区间分片 sys_p6   dbs2   移动到 dbs3  

ALTER FRAGMENT ON TABLE tab MODIFY

          PARTITION p1 TO PARTITION p1 IN dbs2,

          PARTITION sys_p6 TO PARTITION sys_p6 IN dbs3;

然而,当系统生成分片后,您不能修改该区间分片的表达式。考虑此表:

CREATE TABLE tab (i INT, c CHAR(2))

          FRAGMENT BY RANGE (i)      

          INTERVAL (100) STORE IN (dbs1, dbs2, dbs3)

          PARTITION p0 VALUES < 100 IN dbs0,

          PARTITION p1 VALUES < 200 IN dbs1;   

          

          INSERT INTO tab VALUES (201, "AA");  

          -- creates interval fragment sys_p2

          -- with fragment expression >= 200 AND < 300

          INSERT INTO tab VALUES (601, "BB");  

          -- creates interval fragment sys_p6

          -- with fragment expression >= 600 AND < 700

现在您不能修改 sys_p2   sys_p6   的分片表达式。如果您尝试修改,则会返回错误。

ALTER FRAGMENT ON TABLE tab MODIFY

          PARTITION sys_p6 TO PARTITION sys_p6

          VALUES < 900 IN dbs2;  

上述语句失败并发生了错误。

 

官网:


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

请登录后发表评论 登录
全部评论

注册时间:2021-06-23

  • 博文量
    15
  • 访问量
    5692