GBase 8s SQL 指南:语法————2.1 SQL 语句

本章节描述了由 GBase 8s  识别的 SQL  语句的语法和定义。

这些 SQL  语句描述按字母顺序显示。

对于某些语句, 重要的语义详细信息显示在此文档集合的其它卷中,如交叉引用所指出的。

对于许多语句、语法图和/或紧跟语法图后的项表, 包括了对 数据类型和表达式  其它语法段  的语法段的引用。

 SQL  语句的名称包括小写字符(如 SET Database Object Mode )时。表示语句名称中的第一 个大小写混合的字符串不是 SQL  关键字,而是表示两个或更多个不同的 SQL  关键字可以跟在前 面的大写关键字后面。

对于语句描述的结构说明,请参阅 SQL  语法概述 

2.1 ALLOCATE COLLECTION 语句

使用 ALLOCATE COLLECTION  语句为集合数据类型的变量(例如 LIST  MULTISET   SET  )或未归类的集合变量分配内存。

语法

元素

描述

限制

语法

variable

要分配的已归类的或 未归类的集合变量的 名称

必须为未分配的 GBase 8s ESQL/C 集合类型主变量

特定于语言 的名称规则

用法

该语句是 SQL ANSI/ISO  标准的扩展。在 ESQL/C  中使用此语句。

ALLOCATE COLLECTION  语句为可以存储 collection  数据类型的值的 ESQL/C  变量分配内存。

要为 GBase 8s ESQL/C  程序创建集合变量:

1.    GBase 8s ESQL/C  程序中作为客户机集合变量声明集合变量。 集合变量可以是已归类或未归类的集合变量。

2.    使用 ALLOCATE COLLECTION  语句为集合变量分配内存。

如果分配内存成功, ALLOCATE COLLECTION  语句会将 SQLCODE  (也就是 sqlca.sqlcode)置

零(0); 如果失败,会将其设置成一个负数错误码。

当不再需要集合变量时, 您必须使用 DEALLOCATE COLLECTION 语句显示地释放内存。在 DEALLOCATE COLLECTION 语句执行成功后,您可以重新使用该集合变量。

提示:  ALLOCATE COLLECTION 语句仅为 GBase 8s ESQL/C 集合变量分配内存。要为 GBase 8s ESQL/C 行变量分配内存, 请使用 ALLOCATE ROW 语句。

示例

以下示例显示如何使用 ALLOCATE COLLECTION  语句为未归类的集合变量 a_set 分配资源:

EXEC SQL BEGIN DECLARE SECTION;

client collection a_set;

EXEC SQL END DECLARE SECTION;

. . .

EXEC SQL allocate collection :a_set;

以下示例显示如何使用 ALLOCATE COLLECTION  语句为已归类的集合变量 a_typed_set  分配资 源:

EXEC SQL BEGIN DECLARE SECTION;

client collection set(integer not null) a_typed_set;

EXEC SQL END DECLARE SECTION;

. . .

EXEC SQL allocate collection :a_typed_set;

2.2 ALLOCATE DESCRIPTOR 语句

使用 ALLOCATE DESCRIPTOR  语句为系统描述符区域(SDA)声明和分配内存。在 ESQL/C   使用此语句。

语法

元素

描述

限制

语法

descriptor

未分配的系统描述符 区域的名称

包含在单引号 ( ' )  中。在 SDA 名称中必 须是唯一的

引用字符 串.

descriptor_var

用来存储系统描述符 区域名称的主机变量

必须包含未分配系统 描述符区域的名称

特定于语 

items

descriptor 中项描述 符的数目。缺省值为  100 

必须是大于零的无符  INTEGER

精确数值

items_var

包含项目数目的主变 

数据类型必须为      INTEGER  SMALLINT

特定于语 

用法

ALLOCATE DESCRIPTOR  语句创建新的系统描述符区域,该区域是内存中的一个位置, 存放 DESCRIBE  语句可以显示的信息,或存放关于查询的 WHERE  子句的信息。

系统描述符区域(SDA)包含一个或多个称为 itemdescriptors  的字段。每个项描述符都有一个数 据库服务器可以接收或发送的数据值。项描述符也包含关于该数据的信息, 例如数据类型、长度、 小数位、精度和可以为 NULL  值。

系统描述符区域存放 DESCRIBE ... USING SQL DESCRIPTOR  语句获取的信息,或者存放关于一 个动态执行语句中的 WHERE  子句的信息。

如果您分配一个系统描述符区域的名称与一个现有系统描述符区域的名称相同,则数据库服务器返 回一条错误消息。如果您使用 DEALLOCATE DESCRIPTOR  语句释放了该描述符,则           ALLOCATE DESCRIPTOR  语句可以重新使用同样的描述符名称。

WITH MAX 子句

您可以使用 WITH MAX  子句标识您需要的项描述符的最大数目。

当您使用此子句时, COUNT  字段设置为您指定的 items  数目。如果您不指定 WITH MAX  子句, COUNT  字段的缺省值为 100 。您可以使用 SET DESCRIPTOR  语句更改 COUNT  字段的值。

ALLOCATE DESCRIPTOR  语句示例

以下示例显示了有效的 ALLOCATE DESCRIPTOR 语句。每个示例都包含 WITH MAX 子句。此示例使 用嵌入的变量名称标识系统描述符区域, 并指定所需的项描述符:

EXEC SQL allocate descriptor :descname with max :occ;

下一示例使用加引号的字符串 desc1  作为系统描述符的标识, 并且使用无符号整数 3 指定该 desc1  区域中所需的项描述符的最大数目:

EXEC SQL allocate descriptor 'desc1' with max 3;

2.3 ALLOCATE ROW 语句

使用 ALLOCATE ROW  语句为 row  变量分配内存。该语句是 SQL ANSI/ISO  标准的扩展。在 ESQL/C  中使用此语句。

语法

元素

描述

限制

语法

variable

要分配的已归类或未  归类的 row变量名称

必须为未分配的 GBase 8s

ESQL/C row 类型主变量

特定于 语言

用法

ALLOCATE ROW 语句为存储 row 类型数据的主变量分配内存。要创建 row 变量, ESQL/C 程序必须 执行以下操作:

1.   声明 row  变量。 row  变量可以是已归类或未归类的 row  变量。

2.   使用 ALLOCATE ROW  语句为 row  变量分配内存。

以下示例显示如何使用 ALLOCATE ROW 语句为已归类的 row变量 a_row 分配资源:

EXEC SQL BEGIN DECLARE SECTION;

row (a int, b int) a_row;

EXEC SQL END DECLARE SECTION;

. . .

EXEC SQL allocate row :a_row;

如果内存分配操作成功,  ALLOCATE ROW  语句会将 SQLCODE  sqlca.sqlcode  的内容) 

零(0); 如果分配失败, 会将其设置为一个负的错误码。

您必须使用 DEALLOCATE ROW 语句显示地释放内存。一旦您使用 DEALLOCATE ROW 语句释放了该 row变量, 您就可以重新使用该 row变量。

提示:  ALLOCATE ROW 语句仅为 GBase 8s ESQL/C row 变量分配内存。要为 GBase 8s ESQL/C collection变量分配内存,请使用 ALLOCATE COLLECTION 语句。

当您在多次函数调用中使用同一 row  变量而未对其解除分配时,会导致客户机计算机上的内存泄 露。因为没有办法确定指针在传递时是否是有效的,所以 GBase 8s ESQL/C  会假设它是无效的, 并将其分配到新的内存位置。

2.4 ALTER ACCESS_METHOD 语句

可以使用 ALTER ACCESS_METHOD  语句更改一个或多个 sysams  系统目录表中用户定义的主或 从的存取方法的属性。

语法

元素

描述

限制

语法

access_method

要更改的

存取方法

的名称

存取方法必须由先前的      CREATE ACCESS_METHOD 语句  sysams 系统目录表中注  册

标识符

owner

存取方法

所有者的

名称

必须拥有该存取方法

所有者名称

purpose

_keyword

表示要更

改的特征

的关键字

关键字必须通过先前的

CREATE  ALTER

用途函数、标 志和值

元素

描述

限制

语法

ACCESS_METHOD 语句和存取 方法相关联

用法

该语句是 SQL ANSI/ISO  标准的扩展。该语句无法修改内置的存取方法。

使用 ALTER ACCESS_METHOD  更改用户定义存取方法的定义。您无法修改内置的存取方法。

您必须是该存取方法的所有者或具有修改用户定义存取方法的 DBA  特权。在符合 ANSI  的数据 库中, 如果另一个用户是该存取方法的所有者,那么 DBA  必须限定该存取方法的名称。

当更改存取方法时, 您同时更改了定义该存取方法的目的选项规范(目的函数、目的标志或目的   值)。例如,您可以更改一个存取方法以分配一个新的用户定义的函数或方法名称,或为一个表的 扫描成本提供乘数。

如果事务正在处理中,则数据库服务器将等待修改存取方法, 直接提交或回滚该事务。该事务完成 之前, 其他任何用户都无法执行该存取方法。

示例

以下语句更改了 remote 用户定义的存取方法:

ALTER ACCESS_METHOD remote

ADD am_scancost = FS_scancost,

ADD am_rowids,

DROP am_getbyid,

MODIFY am_costfactor = 0.9;

上述示例将对该存取方法进行以下修改:

         添加一个称为 FS_scancost( )  的用户定义的函数或方法, 它在 sysams  表中与 am_scancost  关键字向关联。

         设置(添加)  am_rowids  标记

         删除与 am_getbyid  关键字相关联的用户定义的函数或方法

    修改 am_costfactor  

2.5 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

MODIFY

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

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

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

将现有的分片移动到不同的 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_ 开头。

ATTACH 子句

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

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

元素

描述

限制

语法

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  语句中受保护的表。

使用 BEFORE  AFTER   REMAINDER  选项

BEFORE   AFTER  选项允许您在现有分片之前或之后放入新的分片。当分布方案为循环或区间 间隔时,您不能使用 BEFORE   AFTER  选项。

当您连接新的列表或表达式的分片而没有显式地使用 BEFORE   AFTER  关键字选项时, 数据库 服务器会将所添加的分片置于分片存储列表的末尾,除非存在一个余项分片。如果存在一个余项分

片,则新分片会刚好置于该余项分片前。您不能在余项分片之后连接一个新分片。

当分布方案是循环或区间间隔时,您无法定义余项分片。

如果您省略了 AS PARTITION 分片规范, 该分片的名称就是存储它的 dbspace  的名称。如果同一 表的另一个分片已经具有其 dbspace  的名称, 那么数据库服务器会声明异常,并且 ALTER             FRAGMENT ATTACH  操作失败。

将多个未分片表合并以创建一个分片表

当您具有相同表结构的表转换为单独一个表中的分片时, 您是允许数据库服务器管理分片存储,  不是允许应用程序管理分片存储。分布方案可以是循环的或急于表达式的。

要从两个或两个以上相同结构的未分片表创建单独一个分片表, ATTACH  子句必须包含连接列表 中的活表。连接列表是 ATTACH  子句中表的列表。

要在新创建的单独一个分片表中包含 rowid  ,请首先连接所有表, 然后使用 ALTER TABLE  语句 添加 rowid

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

要将一个未分片表连接到一个已分片的表,必须已在独立的 dbspace 中创建该未分片表,并且必 须具有与该分片表相同的表结构。在以下示例中, 循环分布方案将表 cur_acct 分片,而且表    old_acct 是驻留在独立 dbspace 中的未分片表。以下示例说明了如何将 old_acct (作为      consumed table )连接到 cur_acct (作为 surviving table):

ALTER FRAGMENT ON TABLE cur_acct ATTACH old_acct;

当您将一个或多个连接到一个分片表时, consumed_table  必须是未分片的。

 ATTACH  操作中使用 ONLINE  关键字

如果没有错误, ONLINE  关键字指示数据库服务器内部提交 ALTER FRAGMENT ATTACH   作,并在活表上放置意图互斥锁而不是互斥锁。互斥锁只能应用在未分片的死表上。

ONLINE ATTACH  操作的要求

只有通过间隔分片结构分片的 survivingtable  才能使用 ALTER FRAGMENT ONLINE ON TABLE 语句 ATTACH  选项。该死表必须是未分片的。

所有在活表上的索引必须具有与表相同的分片结构。(也就是说, 任何索引都要连接。)出于这一 原因, 如果表中有主键约束或其它参考约束, 那么,建议您首先为该约束创建连接索引,然后使用 ALTER TABLE  语句添加该约束。(缺省情况下, 系统创建的主键约束和其它约束是拆离的。)

对于活表上的每个约束, 死表上必须有相同的相符合的索引。死表上匹配的索引在 ATTACH  操作 里会作为活表上的再生的索引分片。死表上的其它索引将在 ATTACH  操作中被删除。死表上的每 个将会重复利用的索引必须分离于单独的 dbspace  中,并且存储该再生索引的 dbspace  必须是存  储该死表的 dbspace 

如果活表上的索引是唯一的,那么在死表上与其对应的索引也必须唯一。

死表必须具有满足以下条件的检查约束:

         它必须严格符合要连接的分片的表达式。

         它只能跨越一个区间。

最后一个要求, 死表中的行在活表的区间间隔分片结构中只能跨越单个区间,这对于保护数据移动

十分重要。在包含 ONLINE  关键字的 ALTER FRAGMENT ATTACH  操作中不允许数据移动。

ONLINE ATTACH  操作中只能指定一个死表。

所有其它 ATTACH  选项的限制也适用于 ONLINE ATTACH  操作。有关这些限制, 请参阅 ATTACH  子句的一般限制和 ATTACH  子句的其他限制。

ALTER FRAGMENT ONLINE ATTACH  示例

以下 SQL  语句定义了分片表 employee  ,它使用区间间隔存储分布方案,  emp_id  列上使用唯 一索引 employee_id_idx (也是分片密钥) 并在 dept_id  列上使用另一个索引                   employee_dept_idx

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);

最后两条语句使用高于该事务分片的上限的分片键值插入行, 这导致数据库服务器产生了两个新的 区间分片, 由此产生的分片列表包含四个分片:

Fragments in surviving table before ALTER FRAGMENT ONLINE:

p0

p1

VALUES < 200 VALUES < 400

- range fragment

- range fragment (transition fragment)

sys_p2 VALUES >= 400 AND VALUES < 500 - interval fragment

sys_p4 VALUES >= 600 AND VALUES < 700 - interval fragment

下一条 SQL  语句定义了未分片表 employee2  ,它与 employee  表具有相同的列结构, 并在两个   employee  表中索引对应的列(emp_id   dept_id)上放置单独列索引。该语句在 emp_ssn   上定义了唯一索引 employee2_ssn_idx  在列 name  上定义了 employee_dept_idx  索引。这四个索 引都存储在 dbspace dbs4  中。 CREATE TABLE  也语句指定检查约束( (emp_id >=500 AND   emp_id <600) ), 该约束符合要连接死表的分片表达式并跨越了 employee  表结构区间间隔分 片的单个分区。

CREATE TABLE employee2

(emp_id INTEGER, name CHAR(32),

dept_id   CHAR(2), mgr_id INTEGER, ssn CHAR(12),

CHECK (emp_id >=500 AND emp_id <600)) in dbs4;

CREATE UNIQUE INDEX employee2_id_idx ON employee2(emp_id) in dbs4;

CREATE INDEX employee2_dept_idx ON employee2(dept_id) in dbs4;

CREATE UNIQUE INDEX employee2_ssn_idx ON employee2(ssn) in dbs4;

CREATE INDEX employee2_name_idx ON employee2(name) in dbs4;

以下语句因为要连接的分片是区间分片(存储了分片键值低于 employee 表的事务值 400  的分 片)而返回了错误。只有区间分片才能联机连接。

ALTER FRAGMENT ONLINE ON TABLE employee

ATTACH employee2 AS PARTITION p3 VALUES < 300;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值