可以使用 FRAGMENT BY 子句重新定义索引的存储分布策略,而不重新定义该索引。在本文中 FRAGMENT BY 和 PARTITION 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 子句定义的分片策略。