【无标题】

143 篇文章 3 订阅
142 篇文章 0 订阅

GBase 8s ALTER FRAGMENT 语句 INIT子句
INIT 子句
ALTER FRAGMENT 语句的 INIT 子句可以定义或修改现有表或现有索引的分片策略或存储位置。
语法
在这里插入图片描述

INIT 子句可以完成的任务包括:
将未分片表从一个 dbspace 移动到一个命名的分片或另一个 dbspace 。
将分片表转换为未分片表。
将现有的未分片表分片,而不用重新定义它。
将一个分片粗出策略转换为另一个分片存储策略。
将未分片的现有索引分片,而不重新定义该索引。
将分片索引转换为未分片所以。
向表定义添加一个新的 rowid 列。
当您使用 INIT 子句修改表时,系统目录表中的 tabid 值会为受影响的表而更改。该表所有唯一和引用约束的 constrid 值也会更改。
有关您可以存储表的存储空间的更多信息,请参阅使用 IN 子句。
注意: 当您带此子句执行 ALTER FRAGMENT 语句时,如果该表包含任何数据,则会产生数据移动。如果数据值移动,则可能存在:大量日志记录、正在作为长事务放弃的事务、正在受影响的表上存储的比较长的互斥锁。请在此语句不会妨碍日常操作时使用它。
WITH ROWIDS 选项
为分片表包含一个称为 rowid 的隐藏列。缺省情况下,分片表不包含此列。它的整型值定义了此行的物理位置。
要在分片表中包含 rowid 列,必须在 CREATE TABLE 中使用 WITH ROWIDS(或在 ALTER TABLE 中使用 ADD ROWIDS 或在 ALTER FRAGMENT INIT 中使用 WITH ROWIDS)显式地创建。分片表的行中的 rowid 无法使用未分片表中 rowid 的方法辨别该行的物理位置。
当您使用 WITH ROWIDS 选项为一个分片表添加新的 rowid 列时,数据库服务器为每一列分片唯一的 rowid 编号并创建索引以查找该行的物理位置。使用此存取方法的性能媲美使用 SERIAL 、BIGSERIAL 或 SERIAL 列。一个行的 rowid 值无法更新,但在该行存在期间保持稳定。您指定 WITH ROWIDS 选项之后,每行都要求额外四个字节存储 rowid 列。
建议: 当创建新应用时,使用主键而不是 rowid 值作为存取方法。
将分片表转换为未分片表
您可能决定不再使一个表分片。您可以使用 INIT 子句将一个分片表转换为一个未分片表。以下示例显示了最初的分片存储定义,以及如何使用 ALTER FRAGMENT 语句的 INIT 子句转换该表:
CREATE TABLE checks (col1 INT, col2 INT)
FRAGMENT BY ROUND ROBIN IN dbsp1, dbsp2, dbsp3;
ALTER FRAGMENT ON TABLE checks INIT IN dbsp1;
您必须使用 IN dbspace 子句将该表显式地放入一个 dbspace 。
当您使用 INIT 子句将分片表更改为未分片表时,所有连接的索引都成为未分片索引。此外,不使用现有用户定义的索引(拆离索引)的约束都成为未分片索引。所有最新未分片的索引存在于与新未分片表相同的 dbspace 中。
使用 INIT 子句将分片表更改为未分片表既不会对拆离索引的分片存储策略产生影响,也不会对使用拆离索引的约束产生影响。
表的 FRAGMENT BY 子句
使用 ALTER FRAGMENT 语句的 INIT 子句的 FRAGMENT BY选项来分片现有未分片表,或将一个表分片策略转换为另一个。
本文中 PARTITION BY 关键字类似于 FRAGMENT BY 关键字。
表的 FRAGMENT BY 子句

分片列表

在这里插入图片描述

它可作为 CREATE TABLE 子句 FRAGMENT BY (或 PARTITION BY )子句的语法。有关表可用的分片策略的信息,请参阅 CREATE TABLE 中的 FRAGMENT BY 子句 。
范围区间分片的示例
这些示例的定义语句定义了一个现有表的范围区间分片策略。随后的 ALTER FRAGMENT 语句定义了范围区间策略的三个分片,包括非 NULL 分片,数值列 c1 是分片键:
ALTER FRAGMENT ON TABLE T1 INIT
FRAGMENT BY RANGE(c1)
INTERVAL (100+100) STORE IN (dbs3, dbs4, dbs5, dbs6, dbs7, dbs8)
PARTITION part0 VALUES < 0 IN dbs0,
PARTITION part1 VALUES < 1000 IN dbs1,
PARTITION part2 VALUES < 2000 IN dbs2;
(100+100)的区间值表达式定义了列 c1 范围内区间分片的大小为 200 。如果当插入一个 c1 等于或大于2000 行时,这仍是其存储分布,那么数据库服务器会自动创建新的分片以存储行,超出现有分片范围。区间分区以轮循机制的方式存储在 dbs2 、dbs3 、dbs4 、 dbs5 、dbs6 、dbs7 和 dbs8 dbspace 中。
以下语句类似地定义了一个范围区间分片策略(包括非 NULL 分片和 DATE 或 DATETIME 列 c2 是分片键 i)的三个分片:
ALTER FRAGMENT ON TABLE T1 INIT
FRAGMENT BY RANGE(c2)
INTERVAL (NUMTOYMINTERVAL(1,‘MONTH’))
PARTITION part0 VALUES < DATE(‘01/01/2009’) IN dbs0,
PARTITION part1 VALUES < DATE(‘07/01/2009’) IN dbs1,
PARTITION part2 VALUES < DATE(‘01/01/2010’) IN dbs2;
此处 NUMTOYMINTERVAL(1,‘MONTH’) 区间值表达式定义了在 c2 列的范围内的单个月作为区间分片大小。PARTITION 列表定义了三个分片:2008 年12月的 part0 、2008年七月的 part1 和 2009 年12月的 part2 f。如果要插入行的 c2 值不是这三个其中的月,数据库服务器会为这些行创建新的分片。因为 STORE IN 子句没有指定,数据库服务器将在 dbs0 、dbs1 和 dbs2 dbspace 中以轮循机制的方式存储这些范围区间分片,在三个 PARTITION 指定的 IN 关键字之后。
更改一个表上的现有分片存储策略
如果您确定一个表上的初始策略不能满足您的需求,则您可以重新定义该表的分片存储策略。当您更改分片存储策略时,数据库服务器会废弃现有的分片存储策略,并按新的分片存储策略中的定义将记录移到分片中。
以下示例显示了在 account 表上最初定义的分片存储策略,然后显示了重新定义分片存储策略的 ALTER FRAGMENT 语句:
CREATE TABLE account (col1 INT, col2 INT)
FRAGMENT BY ROUND ROBIN IN dbsp1, dbsp2;
ALTER FRAGMENT ON TABLE account
INIT FRAGMENT BY EXPRESSION
col1 < 0 IN dbsp1,
col2 >= 0 IN dbsp2;
当您重新定义一个分片存储策略时,一个现有 dbspace 已满,则您不得在新的分片存储策略中使用它。
在未分片表上定义分片存储策略
INIT 子句可以在未分片表上定义分片存储策略,无论该表是否是使用存储选项创建的。
CREATE TABLE balances (col1 INT, col2 INT) IN dbsp1;
ALTER FRAGMENT ON TABLE balances INIT
FRAGMENT BY EXPRESSION col1 <= 500 IN dbsp1,
col1 > 500 AND col1 <=1000 IN dbsp2, REMAINDER IN dbsp3;
当使用 INIT 子句分片现有未分片表时,该表上的所有索引将以与表相同的方式分片。
索引的 FRAGMENT BY 子句
可以使用 FRAGMENT BY 子句重新定义索引的存储分布策略,而不重新定义该索引。在本文中 FRAGMENT BY 和 PARTITION BY 的关键字类似。
索引的 FRAGMENT BY 子句
在这里插入图片描述

表达式分片子句
在这里插入图片描述

在这里插入图片描述

ALTER FRAGMENT 语句的中索引的 INIT FRAGMENT BY 子句可以在现有索引的存储分布方案上完成以下任一操作,而不需重新定义索引:
将现有的已分片的索引更改为未分片的索引。
将现有分片索引的分布方案更改为另一种类别的分布方案,或另一个具有相同表达式、表或范围区间类型的分布方案。
更改现有索引的范围区间分布方案的区间值或区间分片键(或两者都更改。)
要更改现有的被范围区间策略分片的索引区间值表达式或分片键表达式,您必须使用 ALTER FRAGMENT 语句的 INIT FRAGMENT BY RANGE 选项(而不是 MODIFY 子句)。当您更改其中之一或所有的表达式时,ALTER FRAGMENT ON INDEX 语句中的 Interval Fragment 子句必须定义至少一个范围分片。
当您使用 FRAGMENT BY 或 PARTITION BY 子句将现有存储分片策略转换为另一个分配策略时, GBase 8s 会废弃现有的分片策略并将数据记录移动到新分片策略中您定义的分片中去。当您将一个未分片索引转换为分片索引和将分片索引转换为未分片索引时,数据移动同样发生。
将一个现有的已分片的索引转换为未分片的索引时,您可以使用 INIT 子句指定 IN dbspace(或 PARTITION partition IN dbspace)作为前一个分片索引的唯一存储规范。
正如 CREATE INDEX 语句定义的基于表达式索引分片方案,您在 ALTER FRAGMENT ON INDEX . . . INIT FRAGMENT BY EXPRESSION 语句中指定的每一个表达式都要应用以下限制:
任一表达式所引用的列必须来自当前表。
这些列必须是被索引的列或此被索引的列子集。
表达式无法引用 ROW 类型列的字段。
该表达式中的数据值必须来单个行。
不允许任何子查询、聚合和 CURRVAL 或 NEXTVAL 顺序对象表达式 。
内置的 CURRENT 、DATE 、DBINFO 、DBSERVERNAME 、ROWID 、SITENAME 、SYSDATE 、TODAY 、 CURRENT_USER 和 USER 表达式在此表达式中不可用。
以上限制同样适用于列表和范围区间索引分片结构的分片键表达式,包括 CREATE INDEX 语句的 FRAGMENT BY 子句定义的分片策略。
将索引从表分片存储策略中拆离
您可以使用 ALTER FRAGMENT ON INDEXY 语句的 INIT 子句将索引从表分片存储策略中拆离,这将导致连接的索引成为拆离的索引。这打破了该索引与表分片存储策略的任何相关性。如果 INIT 子句对先前的索引仅指定 IN dbspace 或 PARTITION fragment IN dbspace ,或指定一个和该表的存储选项不同的索引分片存储策略没那么该索引将成为已拆离的索引。
分片唯一索引和系统索引
您可以是使用或基于表达式或轮循分布方案分片表中的唯一索引,但是分片表达式中引用的所有列必须是被索引列。如果您的索引分片策略未能符合这些限制,那么 ALTER FRAGMENT INIT 语句会失败,并且工作会回滚。
您可能在以 Column A 分片的表上具有一个连接的唯一索引。如果您使用 ALTER FRAGMENT INIT 将该表的分片存储更改为 Column B ,则该语句失败。因为唯一索引定义在 Column A 上,要解决此问题,请对该索引使用 INIT 子句以将其从表分片存储策略拆离并将其单独分片。
系统索引(例如引用约束和唯一约束中使用的那些索引)使用用户索引(如果这些索引存在)。如果没有用户索引可以使用,系统索引保留未分片状态,并移到创建该数据库服务器的 dbspace 中。要分片系统索引,请在约束列宏创建一个分片索引,然后使用 ALTER TABLE 语句添加该约束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值