首页 > 数据库 > 国内数据库 > 南大通用GBase8s SQL常用SQL语句(七)
使用 ADD 子句将另一个分片添加到表或索引的现有分片列表中。
ADD 子句

ADD 表达式

|
元素 |
描述 |
限制 |
语法 |
|
dbspace |
存储新的分片的 dbspace 的名称 |
必须存在 |
标识符 |
|
expression |
定义要添加的新分片的表达式 |
必须返回 Boolean 值( t 或 f ) |
条件 ; 表达式 |
|
fragment |
现有分片的名称 |
必须存在 |
标识符 |
|
new_dbspace |
要添加到分片存储方案的 dbspace 的名称 |
必须存在 |
标识符 |
|
part |
您在此处为分片声明的名称。缺省名称是 dbspace 的名称 |
对于与同一索引的另一个分区相同的 dbspace 中的任何分区都是必需的。 |
标识符 |
expression 仅包含当前表中的 column 名称,以及单独一行中的数据值。不允许任何子查询或聚集。此外,在此处,内置的 CURRENT 、 DATE 、 DBINFO 、 SYSDATE 和 TODAY 表达式无效。
向循环分布方案添加新的 Dbspace
您可以向循环分布方案添加更多的 dbspace 。以下示例显示了最初的循环定义:
CREATE TABLE book (col1 INT, col2 INT)
FRAGMENT BY ROUND ROBIN IN dbsp1, dbsp4;
要添加另一个 dbspace ,请如下例使用 ADD 子句:
ALTER FRAGMENT ON TABLE book ADD dbsp3;
您可以向循环分布方案添加更多的 dbspace 。以下示例显示了最初的循环定义:
CREATE TABLE book (col1 INT, col2 INT)
FRAGMENT BY ROUND ROBIN IN dbsp1, dbsp4;
要添加另一个 dbspace ,请如下例使用 ADD 子句:
ALTER FRAGMENT ON TABLE book ADD dbsp3;
在 GBase 8s 中,您可以向现有的循环分布方案添加的分片。它的名称必须在同一 dbspace 多个分片的分布中必须是唯一的。以下示例如在前一节中那样指定相同的最初循环分片存储定义:
CREATE TABLE book (col1 INT, col2 INT)
FRAGMENT BY ROUND ROBIN IN dbsp1, dbsp4;
要添加新的已命名的分片,请按以下示例使用 ADD 子句:
ALTER FRAGMENT ON TABLE book
ADD PARTITION chapter3 IN dbsp1;
新的分布使用 dbsp1 、 dbsp4 和 chapter3 作为 3 部分循环分片存储方案的存储位置。分片 chapter3 中的记录存储在与第一个分片中的记录相互独立的 dbsp1 dbspace 中。
向一个基于表达式的分布方案的分片列表中添加分表达式会将现有分片中的记录重新分配到新的分片中。当您将新的分片添加到分片列表中时,数据库服务器将对位于新分片之后的分片中的所有数值重新求值。( sysfragments 系统目录表中的任一 evalpos 列值标识了此分片在分片列表中的初始位置。)
下一示例显示最初的表达式定义:
FRAGMENT BY EXPRESSION
c1 < 100 IN dbsp1, c1 >= 100 AND c1 < 200 IN dbsp2,
REMAINDER IN dbsp3
要在 dbspace dbsp2 的一个新分片中添加另一个分片以存储 200 到 299 之间的 c1 值的列,请使用以下 ALTER FRAGMENT 语句:
ALTER FRAGMENT ON TABLE news
ADD PARTITION century3 (c1 >= 200 AND c1 < 300) IN dbsp2;
除了满足标准( c1 >= 200 AND c1 < 300 )的行之外,所有原来在余项分片中的行都移动到 dbspace dbsp2 中新的 century3 分区中。
如果当启用自动更新分布统计信息方式,ALTER FRAGMENT ADD 操作会重新分布数据行,数据库服务器会删除已受影响分片的分布统计信息,但是不删除该表的统计信息。该表的下一个查询将会导致数据服务器为重新计算同一分片的统计信息。
BEFORE 和 AFTER 选项可以将新的分片放置于分片列表中现有分片之前或之后。分片的名称是 dbspace 的名称或 PARTITION 子句中声明的名称。如果分布方案是循环或范围区间的,您就不能使用 BEFORE 和 AFTER 选项。
当您连接新的分片而未使用 BEFORE 或 AFTER 选项时,数据库服务器会将所添加的分片置于分片列表的末尾,除非存在一个余项分片。如果存在一个余项分片,则新的分片会刚好置于该余项分片前。您不能在余项分片之后连接一个新分片。
如果一个余项分片已存在,您就不能添加它。如果您在一个余项分片存在时添加一个新的分片,数据库服务器将检索并重新计算余项分片中的所有记录;一些记录将可能移动到新的分片中。余项分片总是分片列表中的最后一项。
您不能向范围区间分片结构的分片列表中添加一个余项分片。
使用 DROP 子句从按循环分片的分片表或索引的分片列表中除去现有分片。对于按范围区间分片的表或索引,您可以使用此子句删除一个或多个存储系统生成的区间分片的 dbspace 列表中的 dbspace 。
使用 DETACH 子句而不是 DROP 子句移除使用范围区间分片的表中的现有分片,例如滚动窗口表。
DROP 子句

|
元素 |
描述 |
限制 |
语法 |
|
dbspace |
存储系统生成的分片的 Dbspace |
当执行该语句时必须存在。 |
标识符 |
|
fragment |
分片的名称 |
当执行该语句时必须存在。 对于列表或范围区间分片, PARTITION 关键字必须在此名称之前。 |
标识符 |
如果表是按表达式分片的,则不可以删除包含无法移动到其它分片的数据的分片。如果分布方案有 REMAINDER 选项或者如果表达式重叠,则可以删除包含数据的分片。如果表只含两个分片,则不能删除其中一个分片。
当您想要取消一个分片表的分片时,请使用 ALTER FRAGMENT 语句的 INIT 子句或 DETACH 子句。而不是 DROP 子句。
如果 fragment 在被创建或添加时未命名,那么 sbspace 的名称同时也是该分片的名称。如果该分片是系统生成的表或索引的范围区间分片,那么它的名称是 sys_p evalpos , evalpos 是系统目录中分片的 sysfragments.evalpos 项。如果一个表或索引使用相同的范围区间分片策略,那么每个系统生成的索引分片具有和该表系统生成分片的一样的标识。
当您删除一个分片时,数据库服务器尝试将被删除分片中的所有记录移到到另一个分片中。在此情况下,目标分片可能没有足够的空间容纳这些添加的记录。如果发生这种情况,请遵循 ALTER FRAGMENT 和事务日志记录 中描述的过程,增加您的可用空间,并重试 ALTER FRAGMENT 操作。
当 DROP 子句指定一个或多个 dbspaces 从范围区间分片策略中移除时,这些 dbspace 不受影响,但数据库服务器会将存储在该 dbspace 中表或索引的分片中的数据移动到其它可用 dbspace 中。(范围区间策略也将会受影响,因为它不再包含在新的系统生成分片的存储位置中的指定的 dbspace 。)
您无法使用 DROP 子句删除一个包含数据的范围区间分片。
您可以使用此子句删除包含数据的分片列表,只要余项分片接收这些数据。
如果此分片表由分片级别统计信息,那么 ALTER FRAGMENT DROP 操作也删除要被移除分片的分片级别统计分布。然而,不会重新计算表级别的统计信息。表的下一个显式或自动的 UPDATE STATISTICS 操作将会重建旧的分片级分布并从表级别分布合并,再将结果存储在系统目录中。
ALTER FRAGMENT 语句的 DROP 子句示例
以下示例显示了如何从循环分片列表删除一个分片。第一行显示如何删除一个索引分片,第二行显示如何删除一个表分片。
ALTER FRAGMENT ON INDEX cust_indx DROP dbsp2;
ALTER FRAGMENT ON TABLE customer DROP dbsp1;
以下每个示例删除除了有列表分片策略定义的分片。第一行显示如果删除表分片,第二行显示如何删除索引分片。
ALTER FRAGMENT ON TABLE T2 DROP PARTITION part4;
ALTER FRAGMENT ON INDEX idx2 DROP PARTITION part4;
在以上所有的示例中,PARTITION 关键字是必需的,已删除的分片的名称为 part4 。如果索引 idx2 在表 T2 中定义,且要其具有与表 T2 相同的存储分布策略,那么第二条语句不是必需的。因为当表分片列表被修改时,数据库服务器会自动修改要连接的索引的分片策略。如果这些分片不为空,那么数据库服务器将把它们的数据移动到余项分片中(如果没有余项分片存在,则会返回错误)。
以下每个示例都删除了存储系统定义区间范围分片的 dbspace (由范围区间分片策略定义)。第一条语句删除来自表分片的存储空间的 dbspaces dbs7 和 dbs8 ,第二条语句删除了来自索引分片的相同存储空间:
ALTER FRAGMENT ON TABLE T1 DROP INTERVAL STORE IN (dbs7, dbs8);
ALTER FRAGMENT ON INDEX idx1 DROP INTERVAL STORE IN (dbs7, dbs8);
如果 idx1 是表 T1 中连接的索引,那么 PARTITION 关键字是必需的而第二条语句非必要:当修改表分片列表时,数据库服务器会自动修改任一已连接的索引的分片策略以匹配该表已变更的策略。如果这些分片不为空,那么数据库服务器会将来自指定 dbspace dbs7 和 dbs8 的分片移动到其它可用 dbspace 中。
官网:
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70002567/viewspace-2788271/ ,如需转载,请注明出处,否则将追究法律责任。