GBase 8s ALTER FRAGMENT 语句
可以使用 ALTER FRAGMENT 语句更改现有表或索引的分布策略或存储位置。该语句是 SQL ANSI/ISO 标准的扩展。
语法
用法
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_evalposrg
此处 evalpos 是 sysfragments.evalpos 的数值(初始值),其中 0 是是指分片列表中第一个分片的 evalpos 值。
在重命名分片期间,当使用新的 partition 名称更改 sysfragments 系统目录表时将会在此分片上放置一个互斥锁, 并且对于初始位置在分片列表中的分片的新的 evalpos 值将会在 ALTER FRAGMENT 操作期间变更。
在创建新的区间分片时,要必须声明非唯一的分片名称,数据库服务器只能重命名在 ALTER FRAGMENT 操作中系统生成的重定位的区间分片的标识符。用户定义的重定位分片的标识符不会自动重命名。
如果您希望在 ALTER FRAGMENT ONLINE ATTACH 语句执行期间或对使用区间分片表执行其它 ALTER FRAGMENT 操作时避免现有的分片的重命名,则您可以首先使用 ALTER FRAGMENT MODIFY 语句用用户定义的名称重命名这些区间分片,其它系统生成的名称可以由 ALTER FRAGMENT 操作更改。用户定义的分片名称不能以字符串 sys_ 开头。