返回首页

gbase数据、南大通用产品文档:GBase8agcluster_ha_event_monitor

更新日期:2024年09月11日

功能
这个参数用于是否控制监听各个gnode 的状态,
以便控制当前执行SQL 来获得该
状态。
参数取值含义说明

参数= 0 禁用监听;

参数= 1 启用监听。
该参数的默认值是1。
表6- 10 参数值范围说明表
默认值
最小值
最大值
1
0
1
使用场景
适用于高可用节点状态响应的场景:
集群查询过程中,由于一些原因某些节点会出现由Online 变为Offline 状态,那
么对应该节点的查询则必须停止下来,执行器在执行过程中会提供高可用节点状
态响应功能,
一旦节点状态变为不可用,
则通知与之相关的查询,
将其停止下来。

GBase 8a MPP Cluster 产品手册
6 附录
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1552

使用 CREATE INDEX 语句为表中的一列或多列,或者使用列作为参数的 UDR
返回的值创建索引。
该语句是 SQL ANSI/ISO 标准的扩展。
语法

索引选项

元素
描述
限制
语法
index
在此为新的索引声明名称
在数据库中的索引名
称中必须唯一
标识符
synonym,
table
要建立索引的标准或临时
table 的名称或者同义词
同义词以及其表必须
存在于当前数据库中
标识符
用法
当发出 CREATE INDEX 语句时,表在互斥方式下锁定。如果另一个过程正在使
用表,CREATE INDEX 返回一个错误。(然而,关于异常,请参阅 CREATE
INDEX 的 ONLINE 关键字。)
如果索引在存储加密数据的列上,则数据库服务器不能使用该索引。
如果包含了可选的 IF NOT EXISTS 关键字,当指定名称的索引已在当前数据库
内的指定的表中定义时,则数据库服务器不采取任何操作(而不是向应用程序发
送异常)。
索引使用当 CREATE INDEX 执行时生效的对照。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 269
辅助存取方法(有时称为 索引存取方法)是一组构建、存取和操作索引结构(如
B-tree 、R-tree 或 DataBlade 模块提供的索引结构)以加速数据检索的数据库服
务器函数。
synonym 或 table 都不可以参考虚拟表或 CREATE EXTERNAL TABLE 语句定
义的表对象。
您不能直接在内置函数中预定函数型索引,但是可以创建一个 SPL 包装器以调用
并返回内置函数的值。此用户定义函数的参数定义了值不能是来自结合数据类型
的列的函数型索引。
以下统计信息由带或不带 ONLINE 关键字的 CREATE INDEX 语句自动生成:

索引级别统计信息,等价于 B-tree 索引以 LOW 方式在 UPDATE
STATISTICS 操作中生成的统计信息。

列分布存储统计信息,等价于一般的 B-tree 索引的非透明主索引列以
HIGH 方式在 UPDATE STATISTICS 操作中生成的分布存储。
索引类型选项
使用 CREATE INDEX 语句的 DISTINCT 或 UNIQUE 和 CLUSTER 选项指定
索引的特征。
索引类型选项
DISTINCT 指定索引所基于的列仅接受唯一数据。
UNIQUE 指定索引所基于的列仅接受唯一数据。
CLUSTER 按索引指定的顺序对表的行重新排序。
UNIQUE 或 DISTINCT 选项用法
如果您未指定 UNIQUE 或 DISTINCT 关键字,则该索引在被索引的列或者被索
引的列集上允许重复的值。
带有唯一索引的列至多可有一个 NULL 值。
您不能为 UNIQUE 索引键指定 R-tree 辅助存取方法。
以下示例创建了一个唯一索引,防止 customer_num 列出现重复值:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 270
CREATE UNIQUE INDEX c_num_ix ON customer (customer_num);
DISTINCT 和 UNIQUE 关键字是同义词,所以以下语句与前面的示例具有相同
的作用:
CREATE DISTINCT INDEX c_num_ix ON customer (customer_num);
两个示例中的索引维持在升序中,这是缺省顺序。下一个示例在同一列上定义了
一个名为 c_num_desc_ix 的唯一降序索引:
CREATE UNIQUE INDEX c_num_desc_ix ON customer (customer_num
DESC);
您也可以通过创建带有 CREATE TABLE 的唯一约束或 ALTER TABLE 语句 的
ADD CONSTRAINT 子句来阻止列或列组中的复制。
在一个 NLSCASE INSENSITIVE 数据库中,NCHAR 和 NVARCHAR 数据类型
列上的索引忽视字母大小写差异,以致于数据库服务器将由相同字母序列组成的
不同大小写的字符串视为重复值。如果新行中列值与同一表中现有行同一列的值
的不同之处仅在于大小写,则您不能向具有 NCHAR 或 NVARCHAR 列并在其
列定义了唯一约束或唯一索引的表中插入行或更改该表的行。有关带有
NLSCASE INSENSITIVE 属性的数据库的更多信息,请参阅 在 NLSCASE
INSENSITIVE 数据库中重复的行 和 在区分大小写的数据库中的 NCHAR 和
NVARCHAR 表达式 。
CLUSTER 选项用法
您不能在同一语句中同时指定 CLUSTER 选项和 ONLINE 关键字。此外,一些
辅助存取方法(如 R-tree )不支持集群。在您为索引指定 CLUSTER 之前,请
确保它使用支持集群的存取方法。
如果同一表上已存在 CLUSTER 索引,则 CREATE CLUSTER INDEX 语句失败。
CREATE CLUSTER INDEX c_clust_ix ON customer (zipcode);
该语句在 customer 表上创建了一个索引,并按行的邮政编码对行做物理的升序
(缺省的)排序。
如果指定了 CLUSTER 选项并且数据中存在分片,则仅在每个分片内集群数据
值,而非在整个表全局集群数据值。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 271
如果 CREATE CLUSTER INDEX 语句还包含 COMPRESSED 关键字作为存储选项,则
数据服务器发出错误 -26950 。要创建支持压缩的聚簇索引,需要两步:

使用 CREATE CLUSTER INDEX 语句定义不带索引压缩的集群索引。

调用带有 'index compress' 参数的 SQL 管理 API task( ) 或
admin( ) 函数压缩现有的聚簇索引。
您不能在树索引的集群中使用 CLUSTER 选项。
索引是如何影响主键、唯一和引用约束的
数据库服务器为主键、唯一和引用约束创建内部 B-tree 索引。如果创建表之后添
加了主键、唯一或引用约束,则在受约束的列使用用户创建的索引(如果合
适)。
适当的索引是索引与在主键、引用或唯一约束中使用的相同的列的索引。
如果适当的用户创建的索引不可用,则数据库服务器在约束列或列组上创建未分
片的内部索引。
索引键规范
使用 CREATE INDEX 语句的索引键规范定义索引的键值。它也可以指定升序或
降序顺序和运算符类。
这是索引键规范的语法:
索引键规范

元素
描述
限制
语法
column
对此索引用作键的

请参阅将列作为索引键的限制。
标识符

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 272
元素
描述
限制
语法
function 对此索引用作键的
用户定义函数
必须为不返回大对象数据类型的非
变量函数。不能是内置代数、指
数、日志或十六进制函数。
标识符
func_col 值作为函数参数的

不能是集合数据类型。请参阅使用
函数的返回值作为索引键。
标识符
op_class 与此索引键的列或
函数相关联的运算
符类
如果 USING 子句中的辅助存取方法
没有缺省运算符类,则您必须在此
指定一个。(请参阅 使用运算符
类。)
标识符
索引键值可为包含内置数据类型的一个或多个列。如果指定多个列,列集合中的
值并置将被作为索引的单个组合列。
索引键值也可以是下面几种列之一:

LVARCHAR(size)类型的列,如果 size 小于 387 字节

包含用户定义的数据类型的一个或多个列

用户定义的函数返回的一个或多个 值(称为函数型索引),UDF 的参数
列表是同一行中一个或多个列值

一列或多列的值和来自一个或多个用户定义函数返回值的组合
387 子字节的 LVARCHAR 大小限制是 dbspaces 的缺省页大小(2 千字节),
但是大的页大小的 dbspace 不支持大索引键大小,如下表所示。
页大小
最大索引键大小
2 千字节
387 字节
4 千字节
796 字节
8 千字节
1,615 字节
12 千字节
2,435 字节
16 千字节
3,245 字节
指定排列顺序

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 273
缺省情况下,索引按升序顺序排序,从最小值到最大值,根据区域设置的排列顺
序,或者如果 SET COLLATION 语句指定了非缺省排列顺序,根据创建索引时生
效的顺序。您可以使用 DESC 关键字颠倒此排列顺序,以致于索引按最大值到最
小值排序。
如果您在索引键规范中显式地指定 ASC 关键字,则该索引按照升序顺序排序。
指定运算符类
如果在 USING 子句中的辅助存取方法没有缺省的运算符类,则索引键规范可以
为此索引指定运算符类。
如果在 USING 子句中的辅助存取方法有缺省的运算符类,则索引键规范可以为
此索引指定覆盖此缺省运算符类的运算符类。
将列作为索引键的限制
以下限制应用到 CREATE INDEX 语句参考的索引键规范的任何列或列列表:

所有列必须存在并必须位于创建该索引的表中。

表必须存在于当前数据库中,且不能是 CREATE EXTERNAL TABLE 语
句定义的对象。

该列的数据类型不能是集合数据类型。

列的最大值和所有列的总宽度的最大值取决于数据库服务器的页大小。请
参阅 创建复合索引。

您无法对在其上已有唯一约束的列或者列列表添加升序索引。请参阅 使
用 ASC 和 DESC 排序顺序选项 。

您无法对有主键约束的列或者列列表添加唯一索引。原因是:将列或列列
表定义为主键将使数据库服务器在列或列列表上创建唯一的内部索引;你
不能使用 CREATE INDEX 语句在此列或列列表上定义另一个唯一索
引。

您可在同一列或同一列组上创建的索引数是受限制的。请参阅 列组上索
引数目的限制。
有关应用到指定为函数型索引的参数的列的其它索引键的限制,请参阅 使用函数
的返回值作为索引键 。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 274
使用函数的返回值作为索引键
函数型索引是对指定函数返回的值建立的索引,而非对列的值建立索引。例如,
以下语句在将函数 Area( ) 返回的值作为键使用的表 zones 上创建函数型索
引:
CREATE INDEX zone_func_ind ON zones (Area(length,width));
可在 SPL 例程中创建函数型索引。也可在不返回大对象的非变量用户定义的函数
上创建索引。
函数型索引可以是 B-tree 索引、R-tree 索引或者用户定义的辅助存取方法。
函数返回的值可以是索引键,如上例所示,或者可以是其它键部分是列值、部分
列值或者是其它函数索引的返回值的复合索引(有关更多信息,请参阅 创建复合
索引)。
重要: 数据库服务器在定义函数型索引的用户定义例程(UDR)上施加以下限
制:

参数不能是集合数据类型(LIST 、MULTISET 或 SET)列的名称。

此函数不能返回 BLOB 、BYTE 、CLOB 和 TEXT 数据类型的大对
象。

此函数不能是 VARIANT 函数。

此函数不能包含任何 SQL 的 DML 语句。

当您创建函数型索引时,ONLINE 关键字无效;请参阅 CREATE INDEX
的 ONLINE 关键字 。

此函数必须是用户定义函数。您不能在任何 SQL 的内置函数上创建函数
型索引。
然而,除了以上最后一条限制,您可以在调用非变量内置 SQL 函数的用户定义
函数上创建函数型索引以,以致于内置函数返回的值是函数型索引的索引键。
(即,创建调用并返回 SQL 内置函数的值的 SPL 包装器,然后在此用户定义的
SPL 函数上定义函数型索引。)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 275
创建复合索引
简单索引在其索引键规范中仅列出一个列(或者仅一个函数,参数列表必须是一
列或多列列表)。其它索引是复合索引。您应当按照从最常用到最少用的顺序在
符合索引中列出这些列。
如果您使用 SET COLLATION 指定非缺省的语言环境的排列顺序,则可以使用不
同的对照在同一列集合上创建多个索引。(类似索引仅在 NCHAR 或
NVARCHAR 列上使用。)
以下示例使用 stock 表的 stock_num 和 manu_code 列创建复合索引:
CREATE UNIQUE INDEX st_man_ix ON stock (stock_num, manu_code);
UNIQUE 关键字阻止 stock_num 和 manu_code 的给出组合的任何复制。缺省
情况下索引是升序的。
您可在一个复合索引中最多包含 16 列。单个组合索引中的所有已建立索引的列
的总宽度不能超过 380 字节。
索引键部件是表中的一列或者一个或多个列上用户定义的函数的结果。复合索引
可最多有 16 键部分(为列时),或者最多 341 键部分(为 UDR 返回的值
时)。此限制是语言相关的,并应用到 SPL 或 Java™ 所写的 UDR ;基于 C
语言 UDR 的函数型索引可最多有 102 个键部分。复合索引可将任一以下项作为
索引键:

一列或多列

用户定义的函数返回的一个或多个值(称为函数型索引)。
复合索引的索引键部分可以是列和用户定义函数的组合。
对于缺省 2 千字节页大小的 dbspace ,除了 GBase 8s 的函数型索引(它依赖的
语言的限制已在本节的前面描述过),单个 CREATE INDEX 语句中所有索引的
列的总宽度不能超过 387 字节。 对于 dbspace 中最大大小大于 2 千字节,请参
阅 索引键规范 。
无论该索引是否直接基于表中的列值或者将列值作为参数的函数上,索引键的最
大大小仅取决于页大小。Dbspace 中函数型索引的最大索引键大小与列索引一样
都大于 2 千字节,列索引和函数型索引的唯一不同是键部件的数量。基于列的索

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 276
引可以有多于 16 个键部件,但是函数型索引具有不同的依赖于语言限制的键部
件。对于给出的页大小,基于列的索引和函数索引最大索引键大小都一样。
使用 ASC 和 DESC 排序顺序选项
ASC 选项指定了索引维持在升序中; 这是缺省顺序。DESC 选项可以指定以降
序顺序保存的索引。这些 ASC 和 DESC 选项仅限于 B-trees 有效。
唯一约束在排序顺序选项上的影响
当列或列列表在 CREATE TABLE 或 ALTER TABLE 语句中定义为唯一时,数
据库服务器通过创建唯一升序索引实施 UNIQUE CONSTRAINT 。因此,您无法
使用 CREATE INDEX 语句来将升序索引添加到已经定义为唯一的列或列列表
上。
然而,您可以在这样的列上创建降序索引,并且可以将这些列包含在不同组合的
组合升序索引中。例如,以下序列的语句是有效的:
CREATE TABLE customer (
customer_num SERIAL(101) UNIQUE,
fname CHAR(15),
lname CHAR(15),
company CHAR(20),
address1 CHAR(20),
address2 CHAR(20),
city CHAR(15),
state CHAR(2),
zipcode CHAR(5),
phone CHAR(18)
);

CREATE INDEX c_temp1 ON customer (customer_num DESC);
CREATE INDEX c_temp2 ON customer (customer_num, zipcode);
在此示例中,在 customer_num 列上放置了一个唯一约束。第一个 CREATE
INDEX 语句在 customer_num 列上放置一个按降序顺序排序的索引。第二个
CREATE INDEX 将 customer_num 列作为复合索引的一部分包含。关于复合索
引的更多信息,请参阅 创建复合索引 。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 277
索引的双向遍历
如果对一列创建索引时不指定 ASC 或 DESC 关键字,则缺省情况下值以升序顺
序存储;但是数据库服务器的双向遍历能力让您对一列仅创建一个索引并将该索
引用于查询;这些查询指定结果以排序列的升序还是降序来排序。
由于此能力,是否将单列索引创建为升序或者降序索引无关紧要。不管您为索引
选择哪种存储顺序,数据库服务器在处理查询时可按照升序或降序顺序来遍历该
索引。
然而,如果您在表上创建一个复合索引,可能需要 ASC 和 DESC 关键字。例如,
如果您希望输入其 ORDER BY 子句按照多个列排序并且按照不同的顺序对每个列
排序的 SELECT 语句,并且您希望对此查询使用一个索引,则需要创建一个与
ORDER BY 列对应的复合索引。例如,假设您希望输入以下查询:
SELECT stock_num, manu_code, description, unit_price
FROM stock ORDER BY manu_code ASC, unit_price DESC;
此查询通过 manu_code 列的值升序排序,然后按照 unit_price 列的值降序排
序。要对此查询使用索引,您需要发出一个与 ORDER BY 子句的需求相对应的
CREATE INDEX 语句。例如,您可输入以下两个语句之一来创建索引:
CREATE INDEX stock_idx1 ON stock
(manu_code ASC, unit_price DESC);
CREATE INDEX stock_idx2 ON stock
(manu_code DESC, unit_price ASC);
为此查询使用的复合索引(stock_idx1 或 stock_idx2)不能用于您使用
ORDER BY 子句为两列指定相同的排序方向的查询。例如,假设您希望输入以下
查询:
SELECT stock_num, manu_code, description, unit_price
FROM stock ORDER BY manu_code ASC, unit_price ASC;
SELECT stock_num, manu_code, description, unit_price
FROM stock ORDER BY manu_code DESC, unit_price DESC;
如果您希望使用复合索引来提高这些查询的性能,则需要输入以下 CREATE
INDEX 语句之一。可使用两种已创建的索引之一(stock_idx3 或
stock_idx4 )来提高先前的查询的性能。
CREATE INDEX stock_idx3 ON stock

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 278
(manu_code ASC, unit_price ASC);
CREATE INDEX stock_idx4 ON stock
(manu_code DESC, unit_price DESC);
可在一列上创建不超过一个的升序索引和不超过一个的降序索引。由于数据库服
务器的双向遍历能力,您仅需创建这些索引之一。同时创建与在 stock_num 列上
的升序或者降序排序完全达到相同的结果。
在索引的表上执行 INSERT 或 DELETE 操作之后,索引项的数量在页里变化,
表需要的索引页的数量可以取决于该索引是否指定升序或降序顺序。对于一些加
载和 DML 操作,按降序排序的单个列或多列索引可能导致数据库服务器分配的
索引页多于按升序排序的索引。
列组上索引数目的限制
你可以在列组上创建多个索引,提供到每个索引有一个唯一升序和降序列的组
合。例如,要在 stock 表的 stock_num 和 manu_code 列上创建所有可能的索
引,您能创建四个索引:

两个列上升序的 ix1 索引

两个列上降序的 ix2 索引

ix3 索引在 stock_num 上升序以及在 manu_code 上降序

ix4 索引在 stock_num 上降序以及在 manu_code 上升序
由于数据库服务器的双向遍历能力,你不需要创建这四个索引。您仅需创建两个
索引:

ix1 和 ix2 索引对于用户为两个列指定的相同的排序方向(升序或降序)
的排序达到相同的结果,因此您仅需这对索引之一。

ix3 和 ix4 索引对于用户为两个列(第一列上的升序和第二列上的降序或
反之)指定的不同的排序方向的排序达到相同的结果。因此,您仅需创建
这对索引之一。(另见 索引的双向遍历。)
如果每个索引都有不同的排列顺序,则 GBase 8s 还可以支持对同一升序和降序
列组合的多个索引;请参阅 SET COLLATION 语句 。
使用运算符类
运算符类是用于查询优化和构建索引的与辅助存取方法相关的运算符集合。如果
以下两个之一成立,则当创建索引时您必须指定运算符类:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 279

对辅助存取方法不存在缺省运算符类。(用户定义的存取方法可提供非缺
省运算符类。)

您希望使用与辅助存取方法提供的缺省运算符类不同的运算符类。
如果使用代替的存取方法,并且如果存取方法有一个缺省运算符类,则您能在此
省略运算符类;但是如果您不指定运算符类并且辅助存取方法没有缺省运算符
类,数据库服务器返回一个错误。有关更多信息,请参阅缺省运算符类。以下
CREATE INDEX 语句在将 abs_btree_ops 运算符类用于 cust_num 键的
cust_tab 表上创建一个 B-tree 索引:
CREATE INDEX c_num1_ix ON cust_tab (cust_num abs_btree_ops);
使用 access-method 子句
USING 子句为新的索引指定辅助存取方法。
使用 access-method 子句

元素
描述
限制
语法
parameter
此索引的辅助存取
方法参数
请参阅您的用户定义存取方法
的用户文档
引用字符串
sec_acc
_method
此索引的辅助存取
方法
方法可为 B-tree 、R-
tree 、BTS 或用户定义的存
取方法,如 DataBlade 模块
定义的方法
标识符
value
指定 parameter
的值
必须是辅助存取方法中
parameter 的有效的文字值
引用字符串
或 精确数

辅助存取方法是执行索引所需的所有操作的一组例程,如创建、删除(drop)、
插入、删除(delete)、更新和扫描。
数据库服务器提供以下辅助存取方法:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 280

一般 B-tree 索引是内置辅助存取方法。
B-tree 索引有助于检索某一范围数据值的查询。数据库服务器实现此辅助
存取方法并在系统目录表中将其注册为 btree 。

R-tree 方法是注册的辅助存取方法。
R-tree 索引有助于搜索多维数据。数据库服务器在数据库的系统目录表中
将此辅助存取方法注册为 rtree。R-tree 辅助存取方法对 UNIQUE 索引
键无效。R-tree 索引不能都被集群。R-tree 索引可存储在非缺省页大小的
dbspace 中。有关 R-tree 索引的更多信息,请参阅 GBase 8s R-Tree 索引
用户指南 。

bts 方法是注册的辅助存取方法。
使用 bts 存取方法在存储于表的某个列中的文档存储库中执行词和语句
的基本文本查询。要执行基本文本查询,请使用 bts 存取方法在文本列
上创建索引,然后使用 bts_contains() 查询谓词函数和其它管理函数。有
关 bts 存取方法的更多信息,请参阅Create the index by specifying the bts
access method 。
您指定的存取方法必须在 sysams 系统目录表中注册。缺省辅助存取方法是 B-
tree 。
如果存取方法是 B-tree ,则您仅能为每个升序或降序列的组合或使用运算符类的
功能键创建一个索引。(此限制不适用于其它辅助存取方法。)缺省情况下,
CREATE INDEX 创建一个一般 B-tree 索引。如果希望使用非B-tree 的辅助存取
方法来创建索引,则您必须在 USING 子句中指定辅助存取方法的名称。
一些用户定义的存取方法作为 DataBlade 模块打包。一些 DataBlade 模块提供在
创建它们时需要特定参数的索引。关于用户定义的存取方法的更多信息,请参阅
您的辅助存取方法的文档或 DataBlade 模块。
以下(实现 R-tree 索引的数据库的)示例在包含不透明数据类型 point 的
location 列上创建 R-tree 索引,并在 location 上执行带有过滤器的查询。
CREATE INDEX loc_ix ON TABLE emp (location) USING rtree;
SELECT name FROM emp WHERE location N_equator_equals point('500, 0');
以下 CREATE INDEX 语句创建使用 fulltext 辅助存取方法的索引,它接受两个
参数:WORD_SUPPORT 和 PHRASE_SUPPORT 。它为表 t 建立索引,它有两列:i,
一个整数列,以及 data , 一个 TEXT 列。
CREATE INDEX tx ON t(data)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 281
USING fulltext (WORD_SUPPORT='PATTERN',
PHRASE_SUPPORT='MAXIMUM');
HASH ON 子句
使用 CREATE INDEX 语句的 HASH ON 子句指定森林树索引的子树(存储区)
的数目及其列。
HASH ON 子句

元素
描述
限制
语法
column
您使用 HASH ON 子句创
建森林树索引的列或列
组的名称
该列表必须是在 CREATE
INDEX 语句中使用的索引
列的前缀列表。
标识符
number
要创建森林树索引所需
的子树(存储区)数
森林树索引的存储区数必
须在 2 到每个 dbspace
可用索引页数之间。
整数文字
用法
森林树索引是拆离的索引。它们不能是连接的索引。
您可以在基本数据类型的列上创建森林树索引。
您不能:

在具有复杂数据类型的列、UDT 、或函数列上创建森林树索引。

当创建森林树索引时,使用 CREATE INDEX 语句的 FILLFACTOR 选
项。因为索引是从顶向底建立。

创建集群的森林树索引。

在森林树索引上运行 ALTER INDEX 语句。

在使用聚合(包括最小和最大范围值)的查询中使用森林树索引。

直接在森林树索引的 HASH ON 列上执行范围扫描。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 282
然而,您可以在不列在 HASH ON 列列表的列上执行范围扫描。对于在
HASH ON 列列表列出的列的范围扫描,您必须创建包含此范围扫描的适
当列表的附加 B-tree 索引。该附加 B-tree 索引可能具有与森林树索引相
同的列列表,加或减一列。

可对 OR 索引路径使用森林树索引。数据库服务器不会在索引列上具有
OR 为此的查询中使用森林树索引。
当您创建森林树索引时,选择足够的列以创建唯一值。
提示: 一般情况下,要选择的列取决于每一列的副本数。例如,如果第一列包含
很少量的副本,如果前两列不包含大量副本,则前两列满足散列。如果前两列包含
大量的副本,则您还需要选择第三个列。
子树的数目取决于您创建的索引的目的。如果您的目的是:

为减少争用,最初创建每个 CPU VP 2 个子树的森林树索引。您可能需
要更多子树,这取决于表中的行数和存在多少副本。

要减少 B-tree 中层级数:
1. 运行 oncheck -pT 命令。
2. 在此输出中,找到每一层级的节点数。
3. 决定需要多少个子树来实现索引中每个数的期望深度。
例如,假设一个索引每页均有 100 个键,该索引有 1M 个键,则该树则看起来
像这样:

Level 1 (root) 100 keys

Level 2 10K keys

Level 3 1M keys
要将 3-level tree 减少到 100 2-level tree, 该索引大概需要 100 个子树。要将 3-
level tree 减少到 10K 1-level tree ,该索引大概需要 10K 个子树。
如果使用了太多的或太少的子树,则森林树页面可以比传统的 B-tree 页面更稀
疏。当页面稀疏时,更多页占据缓冲池,这将导致其它表的缓存变得更少。
示例
以下命令创建了名为 idx1 的森林树索引,它在 c1 列上有 100 个子树:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 283
CREATE INDEX idx1 ON tab1(c1) HASH ON (c1) with 100 buckets;
以下命令创建了名为 idx2 的森林树索引。在此命令中,该语句的 HASH ON
部分的前缀列表是 c1 和 c2,它是在该语句的 CREATE INDEX 部分中使用的
c1 、c2 和 c3 列的前缀列表:
CREATE INDEX idx2 on tab2(c1, c2, c3) HASH ON (c1, c2) with 10 buckets;
以下命令在列 c1 和列 c2 上创建了一个等式查找的森林树索引:
CREATE INDEX idx3 on tab3(c1, c2) HASH ON (c1, c2) with 100 buckets;
以下命令创建了类似于先前森林树索引的 B-tree 索引。该索引用于列 c1 和列
c2 的范围扫描:
CREATE INDEX idx4 on tab4(c1, c2, c3);
FILLFACTOR 选项
当您想要创建压缩索引或为以后索引的扩展提供信息时,可使用 FILLFACTOR
选项指定索引页的充满程度。
FILLFACTOR 选项只在以下情况中有效:

当在一个含有超过 5,000 行并使用超过 100 个表页的表上构建索引时

挡在分片表上创建索引时

当在非分片表上创建分片索引时
不能在森林树索引上使用 FILLFACTOR 选项。
FILLFACTOR Option

元素
描述
限制
语法
percent 当创建索引时每个被索引数据
填充的索引页的百分比。缺省
值为 90 。
1 ≤ percent ≤100 精确数值
当创建索引时,数据库服务器最初仅填充 FILLFACTOR 值指定的节点百分比。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 284
FILLFACTOR 还能在 ONCONFIG 文件中作为参数来设置。CREATE INDEX 语
句上的 FILLFACTOR 子句覆盖 ONCONFIG 文件中的设定。有关 ONCONFIG
文件和您能使用的参数的更多信息,请参阅 GBase 8s 管理员指南。
提供低百分比值
如果您提供一个低百分比值,类似 50 ,您允许索引中的增长。索引的节点最初
填充到一定的百分比并为插入包含空间。可用空间的数量取决于每页中键的数量
以及百分值。
例如,FILLFACTOR 值为 50%,页面将半满并能适应大小的加倍。低百分比值
能导致更快的插入并能用于期望增长的索引。
提高百分比值
如果您提高百分比值,例如 99 ,则索引将是压缩的,并且任何新索引的插入将
呆滞分割节点。密度的最大值是100% 。具有 100% 的 FILLFACTOR 值时,索
引没有空间可用于增长;任何索引的添加都将导致分割节点。
99% 的 FILLFACTOR 值允许每个节点至少一个插入的空间。高百分比值可能产
生更快的查询,并适合与您不希望增长的索引或大部分只读索引。
存储选项
存储选项指定索引的分布方案。您可使用 IN 子句来为整个索引指定存储空间,
或者可使用 FRAGMENT BY 子句来在多个存储空间上分片索引。
存储选项

元素
描述
限制
语法
dbspace
存储索引的 dbspace
必须存在 标识符

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 285
元素
描述
限制
语法
extspace 由 onspaces 命令分配到数据库服
务器外的存储区域的名称
必须存在 请参阅您的存取
方法的文档。
如果您指定任何存储选项(除了 IN TABLE),您将创建一个拆离的索引。拆离
索引是使用特定的分布模式创建的索引。即使为索引指定的分布模式与为表指定
的相同,索引仍被认为要拆离。如果表的分布方案更改了,所有拆离的索引还将
继续使用 Storage Option 子句指定的分布方案。
如果您不包含 Storage Option 子句,则缺省情况下在同一 dbspace 建立连接索
引,并将其作为对应表的分片。然而,如果启用自动定位,则缺省情况下单个分
片中循环表上建立的索引被拆离,并将其放置在服务器选择的 dbspace 中。通过
设置 AUTOLOCATE 配置参数或者将会话环境变量选项设置为正整数来启用自动
定位。
索引的 COMPRESSED 选项
如果索引拥有 2000 或更多的键,则可使用 CREATE INDEX 语句的
COMPRESSED 关键字压缩 B-tree 索引。
您可以在分片表或未分片表上创建压缩的索引。
您不能创建的压缩的索引是集群索引。然而,您可以通过运行带 index compress
参数的 SQL 管理 API task() 或 admin() 函数压缩现有的集群索引。
要被压缩,索引中的分片或索引必须具有至少 2000 个键。如果您在创建不具有
足够多的键的索引时使用 COMPRESSED 选项,则数据库服务器在创建该索引时
不会压缩该索引或分片。即使向该索引添加键,其仍然保持未压缩状态。如果您
想要压缩该索引,则运行带 index compress 参数的 SQL 管理 API task() 或
admin() 函数。
如果表没有足够的数据来提供足够大的索引键样本,则数据库服务器不会压缩该
索引或分片。即使将最小数量的新键添加到现有未压缩的索引中,数据库服务器
仍不会压缩该索引。 然而,压缩索引后,数据库服务器压缩并插入任何新的键到
该索引中。
以下示例在 customer 表的 address 列创建了一个名为 cust3_ix 的压缩的索引:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 286
CREATE INDEX cust3_ix ON customer (address) COMPRESSED
EXTENT SIZE 32 NEXT SIZE 32;
以下示例创建了一个唯一的压缩的索引:
CREATE UNIQUE INDEX cust3_ix ON customer (address) COMPRESSED ;
Extent Size 选项
Extent Size 选项可定义分配到索引的存储 extent 的大小。
Extent Size 选项

元素
描述
限制
语法
first_kilobytes
该索引的第一个
extent 的长度(以
千字节为单位)
必须返回正整数;最
大值是 chunk 大
小,以千字节为单位
表达式
next_kilobytes
每个后续的 extent
的长度(以千字为单
位)
同 first_kilobytes
一样
表达式
first_kilobytes (next_kilobytes)的最小长度是您系统上磁盘页大小的四倍。例
如,如果您有 2 千字节的页系统,则最小长度是 8 千字节。
如果需要修改索引的 extent 大小,则您可以修改生成的卸载表的模式文件中
extent 和下一个 extent 大小。例如,要使数据库更有效率,您可以删除该索引,
修改模式文件中的 extent 大小,然后创建新的索引。有关如何优化 extent 的更
多信息,请参阅 GBase 8s 管理员指南 。
只有您为该索引显式分配作为 extent 大小的 extent 大小的值存储在系统目录
中。您在 CREATE INDEX 语句的 EXTENT SIZE 选项中指定的值存储于
sysindices 系统目录表的 fextsize 列,NEXT SIZE 选项中指定的值存储于同一表
的 nextsize 列中。然而,如果您省略这些选项,数据库服务器在这些系统目录列
中存储零值( 0 ),而非它为该索引的第一个 extent 和第二个 extent 计算并分
配的缺省值。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 287
定义带显式 extent 大小的索引的示例
以下程序段创建了新表并在该表上定义了两个未分片的索引。
CREATE TABLE IF NOT EXISTS t (a INT, b INT);
CREATE INDEX IF NOT EXISTS idx1 ON t(a) EXTENT SIZE 32 NEXT SIZE
32;
CREATE INDEX IF NOT EXISTS idx2 ON t(b);
此处 idx1 的定义指定 32 千字节作为显式 extent 大小。第二个索引 idx2 ,具
有系统计算的缺省 extent 大小。这两个 CREATE INDEX 语句包含这些 extent
大小条目的索引的系统目录描述:

sysindices.fextent 和 sysindices.nextent 列值对 idx1 分别为 32 。

sysindices.fextent 和 sysindices.nextent 列值对 idx2 分别为 0 。
此处 idx2 的 0 值指示没有指定显式 extent 大小(并非指示未分配存储空
间)。
IN 子句
使用 IN 子句来指定持有整个索引的存储空间。您指定的存储空间必须已经存
在。
在 dbspace 中存储索引
使用 IN dbspace 子句指定您希望索引驻留的 dbspac。当和任何选项(除了
TABLE 关键字)一起使用此子句时,将创建拆离的索引。
IN dbspace 子句允许您隔离索引。例如, 如果 customer 表在 custdata
dbspace 中创建,但您希望在称为 custind 的单独的 dbspace 中创建索引,请
使用以下语句:
CREATE TABLE customer
. . .
IN custdata EXTENT SIZE 16;

CREATE INDEX idx_cust ON customer (customer_num) IN custind;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 288
在命名的分区中存取索引分片
除了在 dbspace 中存储索引分片的选项, GBase 8s 还支持在一个或多个
dbspaces 的命名子集中存储索引的分片。除非显式地在 PARTITION BY 或
FRAGMENT BY 子集中声明分片的名称,缺省情况下,每个分片都与它所驻留的
dbspace 拥有相同的名称。这包括了所有分片表和由 GBase 8s 较早期发行版中迁
移过来的索引。
在 extspace 中存储数据
通常,extspace 存储选项与使用 access-method 子句一起使用。有关更多信息,
请参阅您所使用的定制存取方法的用户文档。
使用 IN TABLE 关键字创建索引
指定 IN TABLE 作为存储选项会创建一个存储行为等同于 GBase 8s 较早版本的
缺省的索引。该表的索引和数据页都存储在同一 extent 中,且该索引的 dbspace
分布方案与创建该表时的分布方案相同
使用 IN TABLE 作为存储选项,对未分片 B-tree 索引指定与启用
DEFAULT_ATTACH 环境变量相同的存储方案,但是 DEFAULT_ATTACH 和
IN TABLE 关键字都是不建议使用的功能。
DEFAULT_ATTACH 环境变量的名称保留术语连接索引的过时定义。在当前
GBase 8s 术语中,该术语现在指定一个索引,其数据页存储在单独的 tablespace
中,并且是表的数据页单独 extent,但是索引和其表共享同一 dbspace 分布方案
有关更多信息,请参阅 GBase 8s SQL 参考指南 中 DEFAULT_ATTACH 的描
述。
以下限制应用于作为索引存储选项的 IN TABLE 关键字:

如果您定义索引的表是未分片表,则当指定 IN TABLE 选项时, GBase
8s 发出错误 -212 和 -130 。

你不能在森林树索引上应用 IN TABLE 存储选项。

该选项不支持与可扩展性相关的索引,如 R-tree 索引、函数型索引或
DataBlade 模块提供的索引。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 289

不能使用不同于该表或不同于 DB_LOCALE 所指定的一个排列顺序创
建附加索引。有关 DB_LOCALE 环境变量的更多信息,请参阅 GBase
8s SQL 参考指南 。
GBase 不建议新的应用程序中使用 IN TABLE 存储选项 DEFAULT_ATTACH
环境变量。这样的索引是一个不推荐使用的功能,以后发行的 GBase 8s 可能不
支持此功能。
索引的 FRAGMENT BY 子句
使用 FRAGMENT BY 子句创建拆离索引,并在多个 sbspace 或分区上定义存储
策略。
这类似表的 FRAGMENT BY 子句的语法,但索引分片不支持 ROUND ROBIN
关键字不。PARTITION BY 关键字是此上下文中 FRAGMENT BY 关键字的同义
词。
索引的 FRAGMENT BY 子句

元素
描述
限制
语法
dbspace
存储索引分片的
dbspace
您能指定至多 2,048 个
dbspaces 。所有存储分片的
dbspaces 必须具有相同的页大
小。
标识符
fragment
_key
索引列上的强制转
型、列或函数表达
式。索引根据此表达
式的值分片。
列只能来自当前的表。
表达式
此处 IN 关键字引入了用来存储索引分片的存储空间的名称。如果您在 IN 关键
字时候列出多个 dbspace 名称,则使用圆括号来为 dbspace 列表定界。所有存储

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 290
分片的 dbspaces 必须具有相同的页大小。将位于 EXPRESSION 关键字后面的分
段定义列表括起的圆括号是可选的。
对于使用同一 RANGE 区间或者 LIST 分片策略作为它们表策略的索引,您在
PARTITION 关键字之后声明的每个分片的名称必须与对应表分片的标识符相
同。
对于由 RANGE 区间分片策略分片的连接索引,如果在新插入的行的范围内不存
在表分片,则数据库服务器创建一个新的表分片以存储新行,并为此新表分片声
明系统生成的名称。如果该表被索引,且索引被与表相同的 RANGE 区间策略分
片,则数据库服务器还会创建新的索引分片。在这种情况中,该索引分片具有与
对应表分片相同的系统生成的标识符。有关系统生成的 RANGE 区间分片的信
息,请参阅 Interval fragment 子句和通过 RANGE INTERVAL 分片 。
分片存储表达式上的限制
以下限制适用于此表达式:

每个分片表达式仅可包含来自当前表的列,其数据值仅来自单行。

该表达式必须返回一个 BOOLEAN 值(true 或 false)。

子查询、聚集、用户定义的例程或对 ROW 类型列字段或顺序对象的参
考都是无效的。

内置 CURRENT 、SYSDATE 、TODAY 、SITENAME 、
DBSERVERNAME 、CURRENT_USER 或 USER 函数都无效。

DEFAULT_ROLE 和 CURRENT_ROLE 运算符是无效的。
以上列出的限制也适用于使用 LIST 分片存储策略的索引。
系统索引的分片存储
如果存在用户定义的索引,系统索引(如那些实现引用约束和唯一约束的索引)
将利用用户定义的索引。 如果没有用户定义的索引可以利用,系统索引保留未分
片,并移到创建该数据库的 dbspace 中。
要分片系统索引,请在约束列中创建分片索引,然后使用 ALTER TABLE 语句添
加约束。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 291
唯一索引的分片存储
您可以在使用循环或基于表达式的分布方案的表上分片唯一索引,但是分片表达
式中的列必须是被索引列的一部分。如果您的索引分片存储策略违反了此限制,
则 CREATE INDEX 语句失败并且工作会回滚。
临时表上索引的分片存储
您可在临时表上分片唯一索引(仅当下面的表使用基于表达式的分布方案时)。
就是说,定义临时表的 CREATE TEMP TABLE 语句必须指定显式的基于表达式
的分布方案。(不支持按 ROUND ROBIN 索引的分片,且自动按照 LIST 或
INTERVAL 分片,对于表的唯一索引使用列表或区间存储分区策略。)
如果尝试在当您创建表时没有为其指定分片存储策略的临时表上创建分片的唯一
索引,则数据库服务器在 DBSPACETEMP 环境变量指定的第一个 dbspace 内
创建索引。有关 DBSPACETEMP 环境变量的更多信息,请参阅 GBase 8s SQL
参考指南 。
有关临时表的缺省存储特征的更多信息,请参阅临时表的存储位置。
索引模式
使用 CREATE INDEX 语句的索引方式在 INSERT 、DELETE 、MERGE 和
UPDATE 操作期间指定索引的行为。
索引模式

DISABLED
数据库服务器不在修改基本表的 insert 、delete 和 update 操作之后更新索引。优
化程序在查询执行期间不使用索引。
ENABLED

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 292
数据库服务器在修改基本表的 insert 、delete 和 update 操作之后更新索引。优化
程序在查询执行期间使用索引。 如果 insert 或 update 操作导致复制键值添加到
唯一索引,则语句失败。
FILTERING
数据库服务器在修改基本表的 insert 、delete 和 update 操作之后更新唯一索引。
(此选项对复制索引不可用。)
优化程序在查询执行期间使用索引。如果在过滤方式中,插入或更新操作导致复
制键值添加到唯一索引,则语句继续处理,但是坏行被写入与基本表相关联的违
例表中。关于唯一索引违例的诊断信息被写入与基本表相关联的诊断表。
如果为唯一索引指定过滤,则您也可指定以下错误选项之一。
WITHOUT ERROR
插入或更新操作期间的唯一索引违例没有完整性违例错误返回给用户。
WITH ERROR
插入或更新操作期间的唯一索引违例完整性违例错误返回给用户。
有关变更唯一索引的数据库对象方式的信息,请参阅 约束和唯一索引的模式 。
为唯一索引指定方式
为 CREATE INDEX 语句中的唯一索引指定方式时必须遵守以下规则:

您可将唯一索引的方式设置为 enabled 、disabled 或 filtering 。

如果不指定方式,那么缺省情况下其它索引。

对于设置为过滤方式的索引,如果您不指定错误选项,则缺省为
WITHOUT ERROR 。

当您向现有的基本表添加新的唯一索引并为索引指定禁用方式时,
CREATE INDEX 语句成功,即使索引的列中的复制值将导致唯一索引违
例。

当向现有的基本表添加新的唯一索引并为索引指定启用或过滤方式时,
CREATE INDEX 语句成功(倘若将导致唯一索引违例的索引的列中不存
在复制值)。然而,如果索引的列中存在任何复制值,CREATE INDEX
语句失败并返回一个错误。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 293

当向启用或过滤方式中现有的基本表添加新的唯一索引时,并且复制值存
在于索引的列中,基本表中的错误行没有过滤到违例表中。这样,您无法
使用违例表来监测基本表中的错误行。
当复制值存在于列中时添加唯一索引
如果您试图在启用方式中添加唯一索引但由于复制值在索引的列中而接收到错误
信息,则采取以下步骤来成功添加索引:
1. 在禁用方式中添加索引,再次发出 CREATE INDEX 语句,但是这次指定
DISABLED 关键字。
2. 使用 START VIOLATIONS TABLE 语句为目标表启动违例和诊断表。
3. 发出 SET Database Object Mode 语句来将索引方式更改为启用。当发出此
语句时,违反唯一索引需要的目标表中的现有行在违例表中复制。然而,
您接收到一个完整性违例的错误消息,并且索引保持禁用。
4. 在违例表上发出 SELECT 语句来检索从目标表复制的不一致性。您可能
需要连接违例表和诊断表来获取所有必要的信息。
5. 在违反唯一索引需要的目标表中的行上采取更正操作。
6. 修复目标表中所有不一致行之后,再次发出 SET Database Object Mode 语
句俩奖金用的索引切换为启用方式。这次索引被启用,并且没有返回完整
性违例错误。因为目标表中的所有行满足新的唯一索引需要。
为复制索引指定方式
当您在 CREATE INDEX 语句中为复制索引指定方式时必须遵守以下规则:

可将复制索引设置为启用或禁用方式。过滤方式仅限于唯一索引可用。

如果不指定复制索引方式,则缺省情况下索引是启用的。
数据库服务器如何对待禁用的索引
无论禁用的索引是唯一索引还是重复索引,实际上数据库服务器在数据操纵
(DML)操作期间会忽略该索引。
当禁用索引时,数据库服务器停止更新索引并停止在查询期间使用索引,但是保
留关于禁用索引的目录信息。如果在该列或列组上已经存在禁用索引,则您不能

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 294
在列或列组上创建新的索引。类似地,如果活动的约束依赖的索引被禁用,则您
不能在列或列组上创建活动的(启用的)唯一约束、外键约束或主键约束。
CREATE INDEX 的 ONLINE 关键字
DBA 将 ONLINE 关键字包含在 CREATE INDEX 语句末尾的规范中,从而降低
非互斥存取错误的风险,提高被索引表的可用性。ONLINE 关键字指示数据库服
务器在最小化排它锁持续时间时创建该索引,以致于并行用户存取该表时能创建
索引。
缺省情况下,CREATE INDEX 试图在被索引的表上放置互斥锁以防止创建该索引
时其它用户存取该表。如果另一个用户已经锁定该表或者当前存取的表处于 Dirty
Read 隔离级别,则 CREATE INDEX 语句失败。
即使其它用户正在该被索引的表的上执行 Dirty Read 和 DML 操作,数据库服务
器仍建立索引。一发出 CREATE INDEX ONLINE 语句,该新索引将对用于查询
计划或成本评估的查询优化器不可见,并且数据库服务器也不支持任何在该已建
立索引的表上的 DDL 操作,直到正确地构建了指定的索引。此时,数据库服务
器在用新索引的信息更新系统目录的同时暂时地锁定该表。
CREATE INDEX ONLINE 语句中已建立索引的表可以是永久表也可以是临时表,可
以是日志记录的也可以是没有日志记录的,可以是分片表也可以是非分片表。然
而,在创建具有以下任一属性的索引时,不能指定 ONLINE 关键字:

函数型索引

集群索引

虚拟索引

R-tree 索引

按区间分片策略分区的索引

在按区间分片策略分区的表上的索引
此外,如果在该表上定义了主键,且一个或多个并发的会话正在拥有引用该主键
的外键约束的子表上执行 DML 操作,则 CREATE INDEX ONLINE 操作产生错
误 -710 。在此索引上创建 ONLINE 之前,您必须等待直到所有的具有子表的用
户会话已完成。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 295
以下语句指示数据库服务器在 customer 表的 lname 列上很创建一个名为 idx_1
的唯一联机索引:
CREATE UNIQUE INDEX IF NOT EXISTS idx_1 ON customer(lname) ONLINE;
如果正在创建此索引时,有其它用户在 customer 表中插入了新行,其中 lname
不唯一,则数据库服务器将在它完成创建该新的 idx_1 索引并在系统目录表中注
册此索引后发出一个错误。
术语联机索引指的是数据库在使用 ONLINE 关键字创建或删除索引时所遵循的锁
定策略,而不是索引在完成创建(或销毁)后它继续拥有的属性。然而此术语也
出现在一些错误消息中,在恢复或复原操作中,数据库服务器将把任何您创建为
联机索引的索引重新创建为联机索引。
只有 CREATE INDEX ONLINE 或 DROP INDEX ONLINE 语句可以在同一表或
具有相同标识符的联机索引上并发地引用联机索引。
自动计算分布统计信息
当 CREATE INDEX 语句执行成功,有或没有 ONLINE 关键字, GBase 8s 自动
为新建的索引生成统计信息,并用等同的在根据索引类型方式中 UPDATE
STATISTICS 操作的值更新 sysdistrib 系统目录表:

索引级别统计信息,等同于 UPDATE STATISTICS 在 LOW 方式中生成
的统计信息,它们可用于大多数类型的索引计算,包括 B-tree 、虚拟索
引和函数型索引。

列分布存储统计信息,等同于普通 B- tree 索引的前导索引列在 HIGH
方式中的生成的分布。如果表由少于百万的行,则解析百分比为 1.0 ,
对于较大的表则为 0.5 。
当优化程序为创建新索引的表设置查询计划时,这些分布统计信息对优化程序有
效。
对于复合键索引,只有前导列的分布存储能由 CREATE INDEX 语句隐式地创
建。
以下类型的索引不支持隐式创建分布统计信息:

在用户定义的数据类型的列上的索引

在内置透明数据类型(包括 BOOLEAN 和 LVARCHAR)的列上的索引

R-tree 索引

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 296

连接索引
如果分布统计的计算在 CREATE INDEX 操作期间失败,则数据库服务器在错误
日志中报告该失败,但仍会继续创建索引。
当通过显式或隐式 CREATE INDEX 操作成功创建了分布存储时,如果 SET
EXPLAIN 设置为 ON ,则会生成以下解释信息(类似于 UPDATE STATISTICS 生成
的信息)。
Index: idx_01 on nita.foo
STATISTICS CREATED AUTOMATICALLY:
Column Distribution for: nita.foo.a
Mode: MEDIUM
Number of Bins: 101 Bin size: 100.0
Sort data: 0.3 MB
Completed building distribution in: 0 minutes 33 seconds
有关分布存储统计信息和分布在 LOW 方式和 MEDIUM 方式之间的不同的信
息,请参阅 UPDATE STATISTICS 语句中的描述。

使用Linux 的crypt()系统调用来加密str。
参数salt 是一个至少两个字符的字符串。
如果salt 没有给定,
会使用一个随机数值。

示例
示例1:因未给定salt 值,使用随机数值对“hello”进行加密。
gbase> SELECT ENCRYPT('hello') FROM t;
+------------------+
| ENCRYPT('hello') |
+------------------+
| y/oLk8tmVyZXg |
+------------------+
1 row in set
ENCRYPT()在一些系统上忽略除了str 前8 个字符之外的全部字符,这个行为通过

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 554
使用crypt()系统调用来决定。
如果crypt()在用户的系统上不可用,ENCRYPT()总是返回NULL,所以推荐用户使
用MD5()或SHA1(),这两个函数存在于所有平台上。