GBase8s语法 DETACH子句和INT子句

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

DETACH 子句
使用 ALTER FRAGMENT ON TABLE 语句的 DETACH 子句以将表分片从分布方案拆离,并将这些内容放入新的未分片表中。
此子句在 ALTER FRAGMENT ON INDEX 语句中无效。
有关分布方案的说明,请参阅 FRAGMENT BY 子句 。
DETACH 子句
在这里插入图片描述

用法
执行 DETACH 子句而生成的新表不会从最初的表继承任何索引或约束。只保留数据值。
类似地,新表不从最初的表继承任何特权。而是具有任何新表都有的缺省特权。关于缺省表级别特权的进一步信息,请参阅 表级权限 中的 GRANT 语句。
DETACH 子句无法应用到以下具有任一属性的表中:
定义了 ROWID 列
定义了一列或队列为参考约束的主键
表中定义了 Enterprise Replication 复制
具有拆离索引(即,存储分布方案的索引与表的分片策略不同)
如果省略 PARTITION 关键字,那么分片的名称就是存储分片的 dbspace 的名称。
在以下示例中,系统生成的范围区间分片 sys_pt1 从表 T1 拆离并放置到新的未分片表 detacht1 中:
ALTER FRAGMENT ON TABLE T1 DETACH PARTITION sys_pt1 detacht1;
下一示例为从表 T2 拆离了列表分片 part2 并将其数据放置到新的未分片表 detacht2 中:
ALTER FRAGMENT ON TABLE T2 DETACH PARTITION part2 detacht2;
DETACH 操作后的分布统计信息
某些 ALTER FRAGMENT . . . DETACH 操作可能导致数据库服务器更新初始表的索引结构。当在这种情况下重建索引时,数据库服务器也将重新计算相关联列的分布方案,并且当其为拆离分片的表设置查询计划时这些统计信息可用于查询优化器:
对于在 ALTER FRAGMENT … DETACH 自动重建 B-tree 索引的索引的列(或列的集合),重新计算的列分布统计信息相当于在 HIGH 模式下 UPDATE STATISTICS 语句创建的分布。
如果重建索引不是 B-tree 索引,对应自动重新计算的分布统计信息由 UPDATE STATISTIC 语句在 LOW 模式下创建。
如果启用更新列分布统计信息的自动模式,而且来自正在拆离分片的表具有分片级别分布统计信息,那么数据库服务器使用拆离的分片的统计信息作为新表的分布统计信息。数据库服务器也合并驻留分片数据分布统计信息以计算初始表的新表分布统计信息,并会将结果存储在 sysdistrib 系统目录表中。新表的分布统计信息的注册和旧表的表分布统计的重新计算都在后台运行。
有关在现有表中创建索引或约束时自动生成统计分布的语句的其他信息,请参阅自动计算分布统计信息中的 CREATE INDEX 语句的描述。
在 DETACH 操作中使用 ONLINE 关键字
ONLINE 关键字指示数据库服务器内部提交 ALTER FRAGMENT … DETACH 工作,如果没有错误那么在要拆离分片的表上放置意向互斥锁而不是互斥锁。互斥锁可应用在从拆离分片创建的表上。
您只能对使用范围区间分片结构的表使用 ALTER FRAGMENT ONLINE ON TABLE 语句的 DETACH 选项。
使用范围区间存储分布方案的表具有两种类型的分片:
range 分片,由 CREATE TABLE 或 ALTER TABLE 语句的 FRAGMENT BY 或 PARTITION BY 子句的用户定义
interval 分片,如果具有超出过渡分片值上限(最后一个范围分片)的分片键值的行,那么数据库服务器在 INSERT 和 UPDATE 操作中自动生成该分片。
ONLINE DETACH 操作中只能拆离一个区间分片。
如果已拆离的区间分片不是最后一个分片,那么数据库服务器修改系统生成的遵循分片列表以匹配活表中它们的新的 sysfragments.evalpos 值的拆离分片的名称。在重命名此分片的操作中,当 sysfragments 系统目录正在用新的 partition 名称更新时,在分片上放置互斥锁(并且在 ALTER FRAGMENT DETACH 操作过程中,为在分片列表中变更初始位置的任何分片使用新 evalpos 值)。
活表上所有的索引必须与该表具有相同的分片结构。(即,任何索引必须可连接)由于这个原因,如果此表有主键约束或其它参考约束,那么建议您首先创建为该约束连接索引,然后使用 ALTER TABLE 语句添加该约束。(缺省情况下,主键约束的系统创建索引和其它已拆离的参考约束。)
如果有会话正在访问要拆离的同一分区,建议您声明 SET LOCK MODE TO WAIT 语句来获得保护非互斥存取错误足够的时间。
其它应用于 DETACH 选项的限制同样适用于 ONLINE DETACH 操作。有关这些限制,请参阅 对 ALTER FRAGMENT 语句的限制 和 DROP 子句。
ALTER FRAGMENT ONLINE … DETACH 的示例
以下 SQL 语句定义了一个分片表 employee ,它使用范围区间存储分布方案,在列 emp_id(也是分片键)上有一个唯一索引 employee_id_idx 在列 dept_id 上有另一个索引。
CREATE TABLE employee (emp_id INTEGER, name CHAR(32), dept_id CHAR(2),
mgr_id INTEGER, ssn CHAR(12))
FRAGMENT BY RANGE (emp_id)
INTERVAL (100) STORE IN (dbs1, dbs2, dbs3, dbs4)
PARTITION p0 VALUES < 200 IN dbs1,
PARTITION p1 VALUES < 400 IN dbs2;
CREATE UNIQUE INDEX employee_id_idx ON employee(emp_id);
CREATE INDEX employee_dept_idx ON employee(dept_id);

INSERT INTO employee VALUES (401, “Susan”, “DV”, 101, “123-45-6789”);
INSERT INTO employee VALUES (601, “David”, “QA”, 104, “987-65-4321”);
最后两条语句使用超出过渡分片上限的分片键值插入了行,这导致数据库服务器生成了两个新区间分片,以致于生成包含四个分片的分片列表:
Fragments in surviving table before ALTER FRAGMENT ONLINE:
p0 VALUES < 200 - range fragment
p1 VALUES < 400 - range fragment (transition fragment)
sys_p2 VALUES >= 400 AND VALUES < 500 - interval fragment
sys_p4 VALUES >= 600 AND VALUES < 700 - interval fragment
以下语句返回了错误,因为指定的要拆离的分片是范围分片(分片存储的行的分片键值低于过渡值 400)。只有区间分片才能联机拆离。
ALTER FRAGMENT ONLINE ON TABLE employee
DETACH PARTITION p0 employee3;
以下语句成功运行,并创建了新表 employee3 以存储已拆离的分片中的数据。
ALTER FRAGMENT ONLINE ON TABLE employee
DETACH PARTITION sys_p2 employee3;

如果有并行的会话访问 sys_p2 ,请将锁定模式设置为 WAIT (提交的 ONLINE DETACH 操作要满足的秒数)以保护非互斥访问错误:
SET LOCK MODE TO WAIT 300;
ALTER FRAGMENT ONLINE ON TABLE employee DETACH PARTITION sys_p2 employee3;

Fragments in surviving table after ALTER FRAGMENT ONLINE:
p0 VALUES < 200 - range fragment
p1 VALUES < 400 - range fragment
sys_p4 VALUES >= 600 AND VALUES < 700 - interval fragment.
使用 BYTE 和 TEXT 列拆离
如果 DETACH 子句指定包含 BYTE 或 TEXT 数据类型的简单大对象的表的第一个分片,那么数据库服务器会锁定该表中每个分片的 blobspace 。要拆离该表的其它分片,那么请只锁定指定分片的 blobspaces ,而不是所有分片的 blobspaces ,如果此分片不是第一个那么需要较少的锁。
从受保护的表拆离
如果 DETACH 子句指定安全策略保护的表执行成功的话,数据库服务器会创建受相同安全策略保护的表,并具有相同行安全标签的 IDSSECURITYLABEL 列,和相同受保护的列集合作为初始表。IDSSECURITYLABEL 列有 NOT NULL 约束。只有持有 DBSECADM 角色的用户可以引用 ALTER FRAGMENT 语句中受保护的表。
生成未分片表的拆离
以下示例使用了已分片为两个 dbspace dbsp1 和 dbsp2 的表 cur_acct:
ALTER FRAGMENT ON TABLE cur_acct DETACH dbsp2 accounts;
此示例将 dbsp2 从 cur_acct 的分布方案拆离,并将这些行放入一个新表 accounts 中。表 accounts 现在具有与 cur_acct 相同的结构(列名、列数、数据类型等),但表 accounts 不包含表 cur_acct 中的任何索引和约束。这两个表现在都未分片的。以下示例显示了一个包含三个分片的表:
ALTER FRAGMENT ON TABLE bus_acct DETACH dbsp3 cli_acct;
此语句将 dbsp3 从 bus_acct 的分布方案拆离,并将这些行放入一个新表 cli_acct 中。表 cli_acct 现在具有与 bus_acct 相同的结构(列名、列数、数据类型等),但表 cli_acct 不包含表 bus_acct 的任何索引和约束。表 cli_acct 是一个未分片表,但表 bus_acct 仍是一个分片表。

INIT 子句
ALTER FRAGMENT 语句的 INIT 子句可以定义或修改现有表或现有索引的分片策略或存储位置。
语法
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、付费专栏及课程。

余额充值