暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

南大通用GBase8s 常用SQL语句(五十一)

晚安的星星云 2022-01-19
491

将列作为索引键的限制

以下限制应用到 CREATE INDEX 语句参考的索引键规范的任何列或列列表:

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

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

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

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

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

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

您可在同一列或同一列组上创建的索引数是受限制的。请参阅 列组上索引数目的限制。

有关应用到指定为函数型索引的参数的列的其它索引键的限制,请参阅 使用函数的返回值作为索引键 。

使用函数的返回值作为索引键

函数型索引是对指定函数返回的值建立的索引,而非对列的值建立索引。例如,以下语句在将函数 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 函数上定义函数型索引。)

创建复合索引

简单索引在其索引键规范中仅列出一个(或者仅一个函数,参数列表必须是一列或多列列表)。其它索引是复合索引。您应当按照从最常用到最少用的顺序在符合索引中列出这些列。

如果您使用 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 千字节,列索引和函数型索引的唯一不同是键部件的数量。基于列的索引可以有多于 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 列作为复合索引的一部分包含。关于复合索引的更多信息,请参阅 创建复合索引 。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论