ITPub博客

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

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

原创 国内数据库 作者:飞天小气球 时间:2021-08-23 13:49:03 0 删除 编辑

MODIFY 子句

使用 MODIFY 子句更改表或索引的分片列表中现有分区上的现有分片表达式,或定义、修改或禁用范围区间或滚动窗口分片结构。

使用 MODIFY 子句更改表或索引的现有分片列表。您可以使用此子句完成以下一个或多个任务:

将现有的分片从一个 dbspace 移动到另一个不同的 dbspace

更改与现有基于列表或基于表达式分片相关的表达式

更改在范围区间分片列表中定义过渡分片的表达式

重命名一个或多个现有的分片

启用或禁用区间分片的自动创建方式

替换 dbspace 的列表或指定存储新区间分片的函数

将一个滚动窗口列表更改为按区间分片的表(没有清除策略)

将按范围区间分片的表更改为滚动窗口列表C

按一下一个或多个操作来更改滚动窗口列表的清除策略:

重新设置区间分片的数量的限制

更改对表的已分配的存储大小的限制

替换 ATTACH  or DISCARD   关键字选项

替换 ANY   INTERVAL FIRST   INTERVAL ONLY   关键字选项

ALTER FRAGMENT 语句的 MODIFY 子句具有以下语法:

MODIFY 子句

 

分片表达式

 

元素

描述

限制

语法

const_expr

定义要分片要存储的列值或此范围区间分片的新的上限值的常量表达式

必须是带引号的字符串或文本值。对于按列表分片,对于同一对象的分片的表达式列表,每个值必须唯一。

常量表达式

dbspace

存储 new  分片的 Dbspace

在执行时必须存在。所有的 dbspace 必须有相同的页大小。

标识符

dbspace _fun

返回 dbspace 名称的 UDF 名称

当数据库服务器调用 URD 为新的分片分配存储时,用户定义函数和返回的 dbspace 必须存在。

CREATE FUNCTION 语句

expression

已修改的表达式

仅可以指定当前表中的列,以及单独一行中的数据。

条件 ; 表达式

new_dbspace

存储系统生成的范围区间分片的 Dbspace

在执行时必须存在。所有的 dbspace 必须有相同的页大小。

标识符

new

您在此处为已修改的分片声明的 名称

在分片列表中分片名称必须唯一。 如果表和它的索引使用相同的范围区间或表分片存储策略,那么每个索引分片必须具有同对应表分片相同的名称。

标识符

old

现有分片的名称

在分片表中必须存在。对于列表或范围区间分片,PARTITION 关键字必须在此名称之前。

标识符

range _expr

范围表达式。定义存储在分片中的分片键的上限。

必须是恒定文字表达式,其与分片键表达式的数据类型兼容的数字、DATETIME 或 DATE 数据类型。另见 范围区间分片的 MODIFY 子句的限制

常量表达式

用法

如果不更改存储位置,那么此处的 dbspace   old (或 old   new   )可以是相同的。对于按范围区间分片的表或索引,dbspace 指定的列表遵循 STORE IN 关键字替换在声明 ALTER FRAGMENT . . . MODIFY 语句之前的 dbspace 列表。之前 dbspace 列表中的分片不会被此选项重置。

STORE IN 子句可以选择指定返回现有 dbspace 名称的用户定义函数,而不是文字 dbspace 标识列表。此 UDF 声明的标识为随意的。有关此 UDF 及如何创建它的示例的更多信息,请参阅在 CREATE TABLE 主题 Interval fragment 子句   STORE IN 子句的讨论。

要使用 MODIFY 子句更改 expression   和移动它的对应分片到新的存储位置时,您必须更改 expression   并且必须指定不同于 dbspace   或分区的名称。

如果同一表或索引的多个分片与 dbspace   名称相同,那么就必须声明 new   分片的名称。在范围区间分片的 new   分片之前必须使用 PARTITION 关键字(但是它对循环分片和基于表达式的分片是可选的)。

expression   必须求出一个 Boolean 值( true false )。

expression   中不允许任何子查询或聚集。此外内置的 CURRENT   DATE   DBINFO   SYSDATE   TODAY   表达式是无效的。

当您使用 MODIFY 子句更改表达式而不变更此表达式的存储位置时,您必须使用与 old   分片的和 new   的分片的名称相同。然而,如果 dbspace 只由一个单独的分区组成,您可指定参考以下示例为 old   dbspace   指定名称:

ALTER FRAGMENT ON TABLE cust_acct

MODIFY dbsp1 TO acct_num < 65 IN dbsp1;

对于分片列表策略,如果新的列表表达式与同一表中或索引中的其他分片的现有列表表达式重叠,那么 ALTER FRAGMENT MODIFY 失败并发送错误。

当您使用 MODIFY 子句将一个 dbspace 移动到另一个 dbspace 中时, old   是分片以前位置的 dbspace 的名称, dbspace   是该分片的新位置。如下所示:

ALTER FRAGMENT ON TABLE cust_acct

MODIFY PARTITION part1 TO PARTITION part2 (acct_num < 35) IN dbsp2;

以上修改了 cust_acct   表的分布方案的 ALTER FRAGMENT 语句 ,这样 acct_num   列中小于 35 的所有行项 ( 先前被分配到分片 part1   的存储在 dbspace dbsp1 中)将会分配到存储在 dbspace dbsp2   中的分片 part2  

当您使用 MODIFY 子句时,底层的 dbspace 不会受到影响。仅会影响到这些分片或 dbspace 中的数据。

如果已经存在非余项分片,除非此分片策略是范围区间策略,您才能重新定义一个非余项分片为余项分片(其他分片的不符合分片键值的行)。然而,如果 REMAINDER 分片中的记录不满足新的 expression ,则您无法将该 REMAINDER 分片更改为一个非余项分片。

attached   索引与它的表具有相同的存储分布。如果表上所有的索引是连接的索引,并且您使用 MODIFY 子句修改此表分片,那么数据库服务器会自动修改此索引的存储分布策略以适应新的表分片策略。

old   规范无引用按范围分区存储分布方案分片的表的过渡分片(最后一个范围分片)。该分片唯一有效的修改是使用 TRANSITION TO const_expr   子句增加此过渡值。有关其它直接尝试重新定义此过渡分片范围表达式的语法,数据库服务器返回错误。 有关更多信息,请参阅主题 使用 MODIFY INTERVAL TRANSITION 选项

范围区间分片的 MODIFY 子句的限制

ALTER FRAGMENT 语句的 MODIFY 子句无法更改此区间值或分片键。要变更此范围区间存储分布方案的任意元素,您必须使用 ALTER FRAGMENT 语句的 INIT 选项。

如果以下任一条件为真,那么 MODIFY 子句不能更改一个分片的范围表达式的值:

此分片是最后一个分片,新的值比旧的值小。

新的值与现有分片的临值重叠。

此分片是系统生成的区间分片。

您可以修改用户定义范围分片的值,但是新的值不能超过相邻分片的界值,而且数据库服务器必须要满足新范围表达式所指示的任何数据移动。

MODIFY 子句能更改存储现有分片的存储空间的列表,并且可以更改将要存储新的系统生成的区间分片的存储空间的列表,但是同样的 MODIFY 子句不能都完成这两个任务。要将两个列表都更改,必须声明两个单独的 ALTER FRAGMENT . . . MODIFY 语句。

类似地,启用或禁用当前范围区间分片方案的 MODIFY 子句不能将现有范围区间分片移动到一个不同的 dbspace 或者创建新的用户定义分片。这些任务都需要单独的 ALTER FRAGMENT . . . MODIFY 语句。

对于表的范围分片和按区间分片的索引,您可以修改首个和中间分片的分片表达式。重叠的分片可通过移动数据来解决,从而使存储在重新定义范围分片中的行的分片键值不会重叠。然而,对于最后一个范围分片,只有此新的范围表达式满足以下条件使,您才可以修改其分片表达式的过渡值:

它不部分或完全符合任何现有区间分片表达式。

它不会符合任何之后系统自动生成的区间分片表达式。

新过渡遗留在分片间的间隙必须是 intvl_expr   区间值的整数倍。

您不能定义一个按范围区间分片的表的余项分片。

如果您使用 MODIFY 子句重命名现有分片,那么新的名称不能以字符 sys_p   开头。

范围、区间和过渡分片

对于使用范围区间存储分片策略的对象,可用于区分三种类型的分片:

range   分片是它的的名称、分片键表达式和存储位置在表或索引定义中被定义的分片。范围区间分片需要定义至少一个范围分片。

interval   分片是它的的名称、分片键表达式和存储位置是由数据库服务器插入或加载操作试图存储分片键值对现有的分片的分片键值表达式为 false 的行时自动定义的分片。

范围分片在 VALUES 子句的上限值比任一其他名为 transition   分片的范围分片的分片键表达式都大。 过渡分片的 VALUES 子句中指定的上限被称为表的 transition value 。如果没有为此对象创建区间分片,那么要添加比过渡值大的分片键值时则需要数据库服务器创建新的区间分片。

在过渡分片上执行的ALTER FRAGMENT 语句的 MODIFY 子句的操作比其它范围和区间分区的 MODIFY 操作更受限制。

ALTER FRAGMENT MODIFY 语句不能更改定义一个过渡分片的范围表达式,除非它包含 MODIFY TRANSITION 关键字。

数据库服务器不能创建区间分片除非在表或索引定义中的 Interval Fragment 子句定义了范围区间分片键,并且此该分片结构没有被 ALTER FRAGMENT . . . MODIFY INTERVAL DISABLE 语句禁用。

修改滚动窗口表的限制

ALTER FRAGMENT MODIFY INTERVAL 语句的 Rolling Window 子句不能在具有以下属性的表上定义清除协议:

该表有一个 ROWID 隐藏列。

另一个表有引用该表中的 PRIMARY KEY 的外键约束。

 

 

官网:

 


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

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

注册时间:2021-06-23

  • 博文量
    15
  • 访问量
    5989