您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

CREATE INDEX 语句

创建指定表或表对的索引。索引一旦创建就再也不能在 SQL 语句中再次引用,除非使用 DROP INDEX 语句将它删除。

快速链接:

转至参数

转至示例

转至用法

转至标准

转至权限

语法

CREATE [ UNIQUE ] [ index-type ] INDEX [ IF NOT EXISTS ] 

…ON [ .]

… (  [ ,  ] …)

…[ { IN | ON }  ]

…[ NOTIFY  ]

…[ DELIMITED BY '‘ ]

…[ LIMIT  ]

index-type

{ CMP | HG | HNG | WD | DATE | TIME | DTTM }

参数

  • index-type 对于 SAP IQ 表中的列,可指定 index-type 为 HG (High_Group)、WD (Word)、DATETIME 或 DTTM (Datetime)。 如果未指定 index-type,则缺省创建 HG 索引。要为 IQ 主存储库表中两列之间的关系创建索引,可指定 index-type 为 CMP(比较)。两个列必须具有相同的数据类型、精度和小数位数。对于 CHARVARCHAR、BINARY 或 VARBINARY 列,精度表示两列具有相同的宽度。 要想获得最快的查询速度,列索引的正确类型取决于: 列中的唯一值数查询中的列的使用方式可用的磁盘空间量可以在 IQ 主存储库表中的列上指定多个索引,但这些索引的索引类型必须不同。CREATE INDEX 不允许添加重复的索引类型。SAP IQ 会选择适用于当前查询或查询的部分的最快索引。但每增加一种索引类型都可能会显著增加对该表的空间要求。

  • 列中的唯一值数

  • 查询中的列的使用方式

  • 可用的磁盘空间量

  • column-name 指定要建立索引的列的名称。列名称是前面带有可选相关名的标识符。(相关名通常是表名。有关相关名的详细信息,请参见“FROM 子句”。)如果列名含有字母、数字和下划线以外的其它字符,则用引号 (“”) 将它引起来。 对于多列索引,只能指定 HG 和 CMP 索引类型。外键要求非唯一索引,组合外键要求非唯一的组合 HG 索引。在单列 HG 索引中,CHARVARCHAR、BINARY 和 VARBINARY 数据的长度不超过 5300 个字节。多列 HG 索引(唯一和不唯一两者皆可)可以包含最多 5297 个字节的单个 CHARVARCHAR 或 BINARY 列。

  • UNIQUE 仅允许索引类型 HG 使用。确保表中不会有两行的值在索引的所有列中相同。每个索引键都必须是唯一的,或者至少在一列中包含 NULL。 如果列定义允许使用 NULL 值并且不强制执行约束(主键或唯一),则 SAP IQ 允许在用户创建的唯一多列 HG 索引的数据值中使用 NULL 值。

  • IF NOT EXISTS 如果指定的对象已存在,则不进行任何更改,也不会返回错误。

  • IN 指定索引放置。如果省略 IN 子句,将在创建表的 dbspace 中创建索引。索引始终与其表放在同一类型的 dbspace(IQ 主存储库或临时存储库)中。装载索引时,数据将跨所有具备可用空间的该类型数据库文件分布。SAP IQ 确保您指定的任何 <dbspace-name> 均适用于该索引。如果尝试为临时表的索引指定 IQ_SYSTEM_MAIN 或其它主 dbspace,则会收到错误消息,反之亦然。Dbspace 始终不区分大小写,无论 CREATE DATABASE...CASE IGNORE 或 CASE RESPECT 规范如何。

  • DELIMITED BY 指定用于将列字符串解析为要存储到相应列 WD 索引中的单词的分隔符。如果忽略该子句或指定该值为空字符串,则 SAP IQ 会使用缺省分隔符集。缺省分隔符集针对缺省归类顺序 (ISO-BINENG) 而设计。它包括非 7 位 ASCII 字母数字字符的所有 7 位 ASCII 字符,但连字符和单引号除外。缺省情况下,连字符和单引号是单词的一部分。缺省分隔符集中有 64 个分隔符。例如,如果列值为以下字符串: The cat is on the mat并且通过使用缺省分隔符的 CASE IGNORE 设置来创建数据库,则此字符串中的下列单词会存储到 WD 索引中:cat is mat on the如果指定多个 DELIMITED BY 和 LIMIT 子句,则不会返回任何错误,但只使用每种类型的最后一个子句。

  • separators-string 必须是数据库创建时使用的归类顺序中的 0 个或多个字符的序列。分隔符字符串中的每个字符都被当作一个分隔符。如果分隔符字符串中没有字符,则会使用缺省分隔符集。(每个分隔符必须是正在使用的归类序列中的单个字符。)分隔符字符串中的字符(分隔符)不能多于 256 个。 要将制表符指定为分隔符,可以在分隔符字符串内键入 字符,或者使用制表符的十六进制 ASCII 代码 \x09。"\t" 指定两个分隔符,\ 和字母 t。要将换行符指定为分隔符,可以键入 <RETURN> 字符或十六进制 ASCII 代码 \x0a。 例如,子句 DELIMITED BY ' :;.\/t' 指定以下七个分隔符:space : ; . \ / t分隔符DELIMITED BY 子句的分隔符字符串制表符' '(键入 )或 '\x09'换行符' '(键入 <RETURN>)或 '\x0a'

  • LIMIT 仅可用于创建 WD 索引。指定 WD 索引中允许的最大单词长度。分析过程中单词长度超过该值会导致错误。缺省值为 255 字节。允许的最小值是 1,允许的最大值是 255。如果 CREATE INDEX 语句中指定的最大单词长度或缺省确定的最大单词长度超过列宽,则所用的最大单词长度会自动缩短至列宽。使用的最大允许单词长度越小,允许插入、删除和更新使用的空间会更小、时间会更短。空词(两个相邻的分隔符)将被自动忽略。创建 WD 索引后,使用创建时确定的分隔符和最大单词大小来解析在相应列中插入的所有内容。创建索引之后,将无法更改这些分隔符和最大单词大小。

  • NOTIFY 在为索引成功添加 n 个记录后,发出通知消息。这些消息会发送到标准输出设备。消息包含与内存使用情况、数据库空间以及当前使用的缓冲区数相关的信息。缺省值为 100,000 条记录。要关闭 NOTIFY,请将其设置为 0。

    示例

  • 示例 1 创建 projected_earnings 和 current_earnings 列的比较索引。这两列是十进制列,具有相同的精度和小数位数。 CREATE CMP INDEX proj_curr_cmpON sales_data( projected_earnings, current_earnings )

  • 示例 2 在 SalesOrderItems 表的 ID 列创建 High_Group 索引。该索引的数据页是从 dbspace Dsp5 中分配的。 CREATE HG INDEX id_hgON SalesOrderItems( ID ) IN Dsp5

  • 示例 3 在 SalesOrderItems 表上为 ProductID 列创建 High_Group 索引: CREATE HG INDEX item_prod_hgON Sales_OrderItems( ProductID)

  • 示例 5 在 earnings_report 表创建 WD 索引。将字符串的分隔符指定为空格、冒号、分号和句点。将字符串的长度限定为 25。 CREATE WD INDEX earnings_wdON earnings_report_table(varchar)DELIMITED BY ‘ :;.’LIMIT 25

  • 示例 6 在 SalesOrders 表上为 OrderDate 列创建 DTTM 索引: CREATE DTTM INDEX order_dttmON SalesOrders( OrderDate )

    用法

  • 如果表在 SAN dbspace 中而此索引在 DAS dbspace 中,CREATE INDEX 语句将导致错误。如果父表不是 DAS dbspace 表,将无法在 DAS Dbspace 中创建表子组件。

  • 无法在 CREATE INDEX 语句中指定索引所有者。索引将自动由定义了这些索引的表的所有者拥有。索引名称对每个所有者必须是唯一的。

  • 无法为视图创建索引。对于给定表,每个索引的名称必须唯一。

  • 只要 CREATE INDEX 影响了当前正由其它连接修改的表,就会禁止该语句。但允许对正在同时添加索引的表进行查询。

  • 创建 WD 索引后,使用分隔符来解析在列中插入的所有内容,而且,在创建该索引后,将无法更改最大单词大小。对于 CHAR 列,至少指定一个空格作为其中的一个分隔符或使用缺省分隔符集。SAP IQ 会自动将 CHAR 列填充至最大列宽。如果列包含空白和字符数据,WD 索引数据查询返回的结果可能会造成误解。例如,列 CompanyName 包含由分隔符分隔的两个单词,但第二个单词以空白填充: ‘Concord’ ‘Farms ’假设用户输入此查询:SELECT COUNT(*)FROM Customers WHERE CompanyName contains (‘Farms’)分析程序确定字符串包含:‘Farms ’而不是:‘Farms’并返回 0 而不是 1。您可以通过使用 VARCHAR 列代替 CHAR 列避免此问题。

  • 数据类型: 无法使用 CREATE INDEX 为包含 BIT 数据的列创建索引。 只能对超过 255 字节的 CHARVARCHAR 数据创建缺省索引、CMP 索引或 WD 索引。 只能对 LONG VARCHAR 数据创建缺省索引类型和 WD 索引类型。 只能对超过 255 字节的 BINARY 和 VARBINARY 数据创建缺省索引类型、CMP 索引类型或 TEXT 索引类型。 无法对具有 FLOAT、REAL 或 DOUBLE 数据的列创建 HNG 索引或 CMP 索引。 只能对具有 TIME 数据类型的列创建 TIME 索引。 只能对具有 DATE 数据类型的列创建 DATE 索引。 只能对具有 DATETIME 或 TIMESTAMP 数据类型的列创建 DTTM 索引。

  • 无法使用 CREATE INDEX 为包含 BIT 数据的列创建索引。

  • 只能对超过 255 字节的 CHARVARCHAR 数据创建缺省索引、CMP 索引或 WD 索引。

  • 只能对 LONG VARCHAR 数据创建缺省索引类型和 WD 索引类型。

  • 只能对超过 255 字节的 BINARY 和 VARBINARY 数据创建缺省索引类型、CMP 索引类型或 TEXT 索引类型。

  • 无法对具有 FLOAT、REAL 或 DOUBLE 数据的列创建 HNG 索引或 CMP 索引。

  • 只能对具有 TIME 数据类型的列创建 TIME 索引。

  • 只能对具有 DATE 数据类型的列创建 DATE 索引。

  • 只能对具有 DATETIME 或 TIMESTAMP 数据类型的列创建 DTTM 索引。

  • 可以对多个列创建唯一的或非唯一的 HG 索引。SAP IQ 可对组成外键的一组列隐式创建一个非唯一的 HG 索引。 仅 HG 和 CMP 是可以包含多列的索引类型。不能对多个列创建 DATETIME 或 DTTM 索引。 多列连接键的最大宽度为 5KB(5300 字节)。允许的列数取决于 5KB 包含的列数。超过 255 字节的 CHARVARCHAR 数据不允许作为单列 HG、DATETIME 或 DTTM 索引中组合键的一部分。 多列索引上的 INSERT 必须包含索引的所有列。 使用多列 HG 索引可以提高在 ORDER BY 子句中对单列进行查询的运行速度。例如: SELECT abs (x) from t1ORDER BY x在以上示例中,HG 索引按排序顺序垂直投影 。 为增强查询性能,请在满足以下条件下,在 SELECT 或 ORDER BY 子句中,使用多列 HG 索引对多个列(也可以包括 ROWID)执行 ORDER BY 操作: 索引中存在所有投影列以及所有排序列(ROWID 除外) 排序键按顺序与前导 HG 列匹配 如果有多个多列 HG 索引满足这些条件,则使用具有最低非重复计数的索引。 如果查询具有一个 ORDER BY 子句,且 ORDER BY 列列表为某个多列索引的前缀(其中,SELECT 列表中引用的所有列均存在于一个多列索引中),则该多列索引执行垂直投影;例如: SELECT x,z,y FROM T ORDER BY x,y如果 SELECT 列表中的基列中存在表达式,并且所有表达式中引用的所有列都存在于多列索引中,则查询将使用多列索引;例如: SELECT power(x,2), x+y, sin(z) FROM T ORDER BY x,y除以上两个先前示例外,如果 ROWID() 函数位于 SELECT 列表表达式中,则将使用多列索引。例如: SELECT rowid()+x, z FROM T ORDER BY x,y,z除以上三个先前示例外,如果 ROWID() 存在于 ORDER BY 列表的结尾处,并且该列表的列(不包括ROWID())以准确顺序使用多列索引,则多列索引将用于该查询。例如: SELECT z,y FROM T ORDER BY x,y,z,ROWID()如果列定义允许 NULL 值使用并且不强制执行约束(主键或唯一),则 SAP IQ 允许在用户创建的唯一多列 HG 索引的数据值中使用 NULL 值。此功能的规则如下: 将 NULL 值视为未定义的值。唯一索引列中允许多个值为 NULL 的行。 在单列索引中,一个索引列中允许多个值为 NULL 的行。在多列索引中,只要其余列中的非 NULL 值可保证该索引中的唯一性,索引列允许多个值为 NULL 的行。在多列索引中,索引涉及的所有列中允许多个值为 NULL 的行。以下示例阐释了这些规则。假定表 table1: CREATE TABLE table1(c1 INT NULL, c2 INT NULL, c3 INT NOT NULL);对允许 NULL 值的列创建唯一的单列 HG 索引: CREATE UNIQUE HG INDEX c1_hg1 ON table1 (c1);根据上面的规则 1,可将 NULL 值插入到索引列的多个行中:INSERT INTO table1(c1,c2,c3) VALUES (NULL,1,1);INSERT INTO table1(c1,c2,c3) VALUES (NULL,2,2);对允许 NULL 值的列创建唯一多列 HG 索引: CREATE UNIQUE HG INDEX c1c2_hg2 ON table1(c1,c2);根据上述规则 2,必须确保索引的唯一性。下面的 INSERT 不成功,因为行 1 和行 3 的多列索引 c1c2_hg2 具有相同的值: INSERT INTO table1(c1,c2,c3) VALUES (NULL,1,3);但根据规则 1 和 3,以下 INSERT 操作会成功: INSERT INTO table1(c1,c2,c3) VALUES (NULL,NULL,3);INSERT INTO table1(c1,c2,c3) VALUES (NULL,NULL,4);唯一性会在多列索引中得到保留。此 UPDATE 操作成功,因为规则 3 允许在多列索引的所有列中包含多个值为 NULL 的行: UPDATE table1 SET c2=NULL WHERE c3=1如果多列 HG 索引受唯一约束制约,则索引中涉及的任何列都不允许 NULL 值。

  • 索引中存在所有投影列以及所有排序列(ROWID 除外)

  • 排序键按顺序与前导 HG 列匹配

  • NULL 值视为未定义的值。

  • 唯一索引列中允许多个值为 NULL 的行。 在单列索引中,一个索引列中允许多个值为 NULL 的行。在多列索引中,只要其余列中的非 NULL 值可保证该索引中的唯一性,索引列允许多个值为 NULL 的行。在多列索引中,索引涉及的所有列中允许多个值为 NULL 的行。

  • 在单列索引中,一个索引列中允许多个值为 NULL 的行。

  • 在多列索引中,只要其余列中的非 NULL 值可保证该索引中的唯一性,索引列允许多个值为 NULL 的行。

  • 在多列索引中,索引涉及的所有列中允许多个值为 NULL 的行。

  • 可以使用 BEGIN PARALLEL IQ … END PARALLEL IQ 语句将要对多个 IQ 主存储表执行的 CREATE INDEX 语句分组在一起,这样便可像一条 DDL 语句那样来执行这些语句。有关详细信息,请参见“BEGIN PARALLEL IQ … END PARALLEL IQ 语句”。

    警告对包含未提交数据的局部临时表使用 CREATE INDEX 命令会失败并生成错误消息必须提交局部临时表 才能创建索引。请先提交局部临时表中的数据,然后再创建索引。 副作用

  • 自动提交

    标准

  • SQL—ISO/ANSI SQL 语法的服务商扩充。

  • SAP 数据库产品 - SAP ASE 的 CREATE INDEX 语句比 SAP IQ 更为复杂。虽然在 SAP IQ 中允许使用 SAP ASE 语法,但一些子句和关键字会被忽略。有关 SAP ASECREATE INDEX 语句的完整语法,请参见《SAP ASE 参考手册第 2 卷:命令》。

    SAP ASE 索引可以是聚簇索引或非聚簇索引。聚簇索引检索数据几乎总是比非聚簇索引快。每个表只允许有一个聚簇索引。

    SAP IQ 不支持聚簇索引。SAP SQL Anywhere 允许使用 CLUSTERED 和 NONCLUSTERED 关键字,但 SAP IQ 将会忽略它们。如果未指定 <index-type>,则 SAP IQ 会对指定的列创建 HG 索引。

    SAP IQ 不允许使用 DESC 关键字。

    对于 SAP IQ 和 SAP ASE,给定表的索引名称必须都是唯一的。

    权限

    需要对要创建索引的 dbspace 具有 CREATE 特权。还需要具备以下特权之一:

  • CREATE ANY INDEX 系统特权。

  • CREATE ANY OBJECT 系统特权。

  • 索引基础表的 REFERENCES 特权。

  • 您拥有索引的基础表。