ITPub博客

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

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

原创 国内数据库 作者:飞天小气球 时间:2021-07-21 11:21:55 0 删除 编辑

1.1  ALTER FRAGMENT 语句

可以使用 ALTER FRAGMENT 语句更改现有表或索引的分布策略或存储位置。该语句是 SQL ANSI/ISO 标准的扩展。

语法

 

元素

描述

限制

语法

surviving _index  

用于修改分布或存储的索引

当该语句执行时必须存在

标识符  

surviving _table  

用于修改分布或存储的表

必须存在。请参阅 对 ALTER FRAGMENT 语句的限制

标识符  

用法

ALTER FRAGMENT 语句仅适用于位于当前站点的表分片或索引分片。不会存储或更新任何远程信息。

要更改一个表的分片存储策略,您必须具有 Alter 或 DBA 特权。要更改一个索引的分段存储策略,您必须具有 Index 或 DBA 特权。

Attention:   此语句可能导致索引被删除或重建。执行更改操作之前,请仔细阅读 GBase 8s 性能指南 中的相应章节以查看影响和策略。

ALTER FRAGMENT 语句的子句支持以下任务。

子句          作用

ATTACH    将两个或多个具有相同模式的表组合到一个分片表中

DETACH    将一个表分片从分片存储策略中拆离,并将其置于一个新表中

INIT        提供以下选项:

·  定义并初始化一个表上的分片存储策略

·  更改对分片表达式求值的顺序

·  更改表或索引的分片存储策略

·  更改现有表的存储位置

·  将数据从现有的表分片移到另一个新的分片表中

·  更改数据库给表或索引生成的分片存储位置

·  更改表或索引的分片键或分片表达式

ADD       将另一个分片添加到一个现有分片存储列表

DROP      从一个分片存储列表删除一个现有分片

移除一个或多个创建内部分片的 dbspace 列表中的 dbspaces

MODIFY    更改现有区间、列表或基于表达式的分片表达

将现有的分片移动到不同的 dbspace 中去

用新的列表替换创建区间分片的 dbspace 当前列表

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

使用 CREATE TABLE 语句或 ALTER FRAGMENT 语句的 INIT 子句来创建分片表。

onspaces   实用程序成功重命名 dbspace 后,只有新的名称能够引用重命名后的 dbspace 。然而,表或索引的现有分片存储策略是由数据库服务器自动更新的,以使用新的 dbspace 名称替换旧的名称。您不需要采取任何额外的操作更新使用旧的 dbspace 名称定义的分布策略或存储位置,但是如果您要在一个 ALTER FRAGMENT ALTER TABLE 语句中引用该 dbspace ,您必须使用新的名称。

如果您忽略可选 ONLINE 关键字, ALTER FRAGMENT 操作需要在参与该操作的所有表上都放置独占存取和独占锁。如果您启用 FORCE_DDL_EXEC 会话环境选项,那么您可以强制已打开的参与 ALTER FRAGMENT ON TABLE 操作的表或任一已放置锁的表的其他事务退出。如果服务器无法获得该表的独占访问和独占锁,那么服务器将会回滚已打开或表中已有锁的事务,直到满足 FORCE_DDL_EXE 选项指定的值。(有关更多信息,请参阅 FORCE_DDL_EXEC 环境选项   。)

ALTER FRAGMENT 语句的限制

您无法将 ALTER FRAGMENT 语句用于临时表、视图、或未在当前数据库注册的表。

如果您的表或索引尚未分片,则您可以使用的子句仅有 ATTACH INIT

您无法将 ALTER FRAGMENT 用于属于表层次结构的类型表。

ALTER FRAGMENT 和事务日志记录 

如果您的数据库支持事务日志记录,ALTER FRAGMENT 将在一个单一事务内执行。如果分片存储策略使用大量记录,可能会耗尽日志空间或磁盘空间。(要修改分片存储策略,数据库服务器需要额外的磁盘空间,它将随后释放这些磁盘空间。)

如果您耗尽日志空间或磁盘空间,请尝试以下过程之一以减少您的日志空间或磁盘空间需求:

关闭日志记录,并在操作结束时将其重新打开。此过程间接地要求备份 root  dbspace

将这些操作分割为多个 ALTER FRAGMENT 语句,每次仅移动较小部分的记录。

关于日志空间需求和磁盘空间需求的信息,请参阅 GBase 8s 管理员指南   。该指南也包含关于如何关闭日志记录的详细指示信息。关于备份的信息,请参阅 GBase 8s 备份与恢复指南

决定分片中的行数

Dbspace 允许多少行,您就可以将多少行放入分片。

要查出一个分片中的行数:

1.  对该表运行 UPDATE STATISTICS FORCED 语句。此步骤会使用当前表的信息填充 sysfragments   系统目录表。

2.  查询 sysfragments   系统目录表以检查 npused   nrows   值。 npused   列向您提供分片中使用的数据页数; nrows   字段向您提供分片中的行数。

ALTER FRAGMENT 操作中的 ONLINE 关键字

ONLINE 关键字指示数据库服务器修改后台中表的存储,并且其它并发用户仍可以继续存取该表。

通过在 ALTER FRAGMENT 语句中使用 ONLINE 关键字, DBA 可以降低非独占存取错误的风险,可以提高分片表的可用性。该指示数据库服务器在内部 ATTACH DETACH MODIFYT 操作以提交工作,如果没有错误,它将在该表上应用一个内部意向排他锁而非排他锁。

DETACH 和 MODIFY 操作中,在以下条件下,ONLINE 关键字可以降低 -710 错误的风险:

AUTO_REPREPARE 配置参数设置为 1  

IFX_ AUTO_REPREPARE 会话环境变量设置为 1  

应用 ALTER FRAGMENT ONLINE FOR TABLE 语句有以下限制:

ALTER FRAGMENT ONLINE 只有 ATTACH DETACH MODIFY 选项是有效的。

FOR TABLE 子句必须指定由范围区间架构分片的表。

正在修改的表不能被 LOCK TABLE 语句显示地锁定。

ALTER FRAGMENT ONLINE 必须是该事务中首个修改任一数据库对象或表的语句。

·  在同一事务中 ALTER FRAGMENT ONLINE 语句后不能出现修改数据库中对象的操作。

自动重命名区间分片标识符

一些 ALTER FRAGMENT 操作可以更改分片表中现有的区间分片位置的顺序。在这些情况下,数据库服务器会自动修改受影响的区间分片的系统定义的名称。

对于由区间分片方案分区的表,添加、删除、附加或拆离分片或修改表的转换值的 ALTER FRAGMENT 操作可以更改现有的间隔分片的 sysfragments.evalpos   值,或者可以将间隔分片更改为范围分片。为了避免创建具有与 ALTER FRAGMENT 语句在分片列表中重新定位的间隔分片相同的系统生成的名称的新的间隔分片,数据库服务会自动使用与标识符名称不匹配的新标识符替换初始系统定义的名称。

以下一般的规则适用于系统生成的范围和区间分片名称:

对于区间分片: sys_ evalpos

对于范围分片: sys_ evalpos rg

此处 evalpos   sysfragments.evalpos   的数值(初始值),其中 0   是是指分片列表中第一个分片的 evalpos   值。

在重命名分片期间,当使用新的 partition   名称更改 sysfragments   系统目录表时将会在此分片上放置一个互斥锁, 并且对于初始位置在分片列表中的分片的新的 evalpos   值将会在 ALTER FRAGMENT 操作期间变更。

在创建新的区间分片时,要必须声明非唯一的分片名称,数据库服务器只能重命名在 ALTER FRAGMENT 操作中系统生成的重定位的区间分片的标识符。用户定义的重定位分片的标识符不会自动重命名。

如果您希望在 ALTER FRAGMENT ONLINE ATTACH 语句执行期间或对使用区间分片表执行其它 ALTER FRAGMENT 操作时避免现有的分片的重命名,则您可以首先使用 ALTER FRAGMENT MODIFY 语句用用户定义的名称重命名这些区间分片,其它系统生成的名称可以由 ALTER FRAGMENT 操作更改。用户定义的分片名称不能以字符串 sys_   开头。

ATTACH 子句

使用 ALTER FRAGMENT ON TABLE 语句的 ATTACH 子句将拥有相同结构的表合并到一个分片存储策略中。

例如,您可以使用该语法,将一个已从表分离的分片组合到一个具有相同分布存储结构的档案表中。

ATTACH 子句

AS 子句

 

范围间隔表达式

 

列表表达式

 

元素

描述

限制

语法

const_expr  

定义分片存储列表的常量表达式

必须是带引号的字符串或文字值。在同一对象的分片中,表中的值必须唯一。

常量表达式  

consumed _table  

要同 surviving_table  合并而失去身份的表

结构必须与 surviving _table  相匹配。不能保护连续列或唯一约束、引用约束或主键约束。另见 ATTACH 子句的一般限制  

标识符  

expr  

定义通过表达式分片的表的分片中存储哪些行的表达式

仅包含当前表中的列以及单一行中的数据值。另见 ATTACH 子句的一般限制 .

条件 ; 表达式

new_frag  

此处声明的 consumed_table  分片的名称。缺省值为 dbspace 名称

surviving_table  分片的名称中必须唯一。

标识符  

old_frag  

含有 surviving_table  分片的分区或 dbspace

必须存在。不能是区间或间隔分片。

标识符  

range _expr  

定义存储在分片中分片密钥的上限的常量表达式

必须是数字的常量文字表达式 、DATETIME 或与分片密钥表达式兼容的 DATE 数据类型。

常量表达式  

surviving _table  

要修改分布或存储位置的表

必须存在。没有任何约束。另见 对 ALTER FRAGMENT 语句的限制

标识符  

当新的表达式分布被连接到由列表或区间间隔分片的表,死表上的数据和活表上的受影响的分片会被扫描并移动到合适的分区,因为这些策略没有重叠。

如果启用了自动更改分布策略模式,并且表连接到分片分布策略,数据库服务器会计算新分片的分布策略。现有分片的旧的分布策略在此时也将重新计算。分片统计的重运算在后台执行。在数据库服务器结束分片统计计算后,它从表分布策略中合并这些分片,并将结果村春在系统目录中。

要使用此子句,您必须具有 DBA 特权或您是指定表的所有者。ATTACH 子句支持以下任务:

通过合并两个或两个以上的相同结构的未分片的表创建单独一个分片表

(请参阅 将多个未分片表合并以创建一个分片表

将一个或多个表连接到一个分片表

(请参阅 将一个表连接到一个分片表

ATTACH 子句的一般限制

此子句在 ALTER FRAGMENT ON INDEX 语句中无效。

您连接的任何表必须先前已在独立的分区中创建。您不能将同一个表连接多次。

ATTACH 子句中所列的所有死表( consumed table )必须具有同活表( surviving table )相同的结构。列的数目、名称、数据类型和相对位置必须相同。

expression   不能包含聚集、子查询、或变体函数。

ATTACH 子句的其他限制

ROW 类型列字段的用户定义的例程和引用是无效的。您不能将一个分片表连接到另一个分片表。

所有存储分片的 dbspace 必须拥有相同的页面大小。

对两个分片表的 ATTACH 操作无法产生按区间或列表分片的活表( GBase_8t surviving table )。(如果您要连接两个非分片的表,使用 ALTER FRAGMENT INIT 操作为其中一个非分片表定义其区间或列表分片结构,然后使用 ATTACH 选项连接第二个表。)

对于按区间分片的活表(surviving tables),有以下限制:

由于数据库服务器决定区间分片的初始位置,所以 BEFORE AFTER 指定无效。

您无法连接表达式符合现有区间分片表达式的分片。

当连接的分片超过事务值,要连接的分片的上限必须位于区间分片的界限。就是说,分片的上限值必须等于事务值乘以区间值的整数倍。

对于受同一安全策略保护的分片表,如果以下任一条件不满足,那么连接分片到表就会是失败:

源表和目标表都受同一安全策略的保护;

两个表都具有相同的保护粒度(是行级别或列级别或都具有行级别和列级别);

在两个表中,受保护的列的相同设置是由相同的安全标签所保护。如果有多余的受保护列,每个表就会有多于一个安全标签,但是该相同的标签必须保护两个表中的相同的列。

如果由于不符合以上任一条件而使 ATTACH 操作失败的话,您可以使用 ALTER TABLE 语句让两个表的模式相同, 然后对其重复 ALTER FRAGMENT ATTACH 语句。

只有持有 DBSECADM 角色的用户才能引用 ALTER FRAGMENT 语句中受保护的表。

官网:

 

 


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

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

注册时间:2021-06-23

  • 博文量
    15
  • 访问量
    5989