ITPub博客

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

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

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

INIT 子句

ALTER FRAGMENT 语句的 INIT 子句可以定义或修改现有表或现有索引的分片策略或存储位置。

语法

INIT 子句

 

元素

描述

限制

语法

dbspace

存储已分片数据的 Dbspace

在执行时必须存在

标识符

fragment

分片的名称

对同一个表不超过 2048 个

标识符

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 子句

 

分片列表

 

约束

描述

限制

语法

column

该策略适用的列

必须存在于表中

标识符

dbspace

包含表分片的 Dbspace

必须指定至少 2 个但不超过 2,048 个 dbspaces

标识符

expr

定义表分片的表达式

必须求出一个 Boolean 值 ( t  或 f )

表达式

part

分片的名称

同一 dbspace 中分片的名称必须作为同一表中另一分片的名称。同一表中的分片的名称必须唯一。

标识符

它可作为 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 子句

 

表达式分片子句

 

元素

描述

限制

语法

dbspace  

包含分片信息的 Dbspace

必须指定至少两个但不超过 2,048 个同一页大小的 dbspaces

标识符  

expr  

定义索引分片的表达式

对于同一索引其分片表达式必须唯一,必须返回Boolean 值

条件 ; 表达式

fragment _key  

基于列值的常量表达式。该索引根据此表达式分片。

任何列必须在此当前表中

表达式  

part  

您在此处为一个指定的分片的名称。缺省值为 dbspace  的名称。

对于与同一索引的另一个分片相同的 dbspace 中的任何分片都是必须的。在同一索引的分片中必须是唯一的。

标识符  

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 语句添加该约束。

官网:

 


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

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

注册时间:2021-06-23

  • 博文量
    15
  • 访问量
    5990