创建指定表或表对的索引。索引一旦创建就再也不能在 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)、DATE、TIME 或 DTTM (Datetime)。 如果未指定 index-type,则缺省创建 HG 索引。要为 IQ 主存储库表中两列之间的关系创建索引,可指定 index-type 为 CMP(比较)。两个列必须具有相同的数据类型、精度和小数位数。对于 CHAR、VARCHAR、BINARY 或 VARBINARY 列,精度表示两列具有相同的宽度。 要想获得最快的查询速度,列索引的正确类型取决于: 列中的唯一值数查询中的列的使用方式可用的磁盘空间量可以在 IQ 主存储库表中的列上指定多个索引,但这些索引的索引类型必须不同。CREATE INDEX 不允许添加重复的索引类型。SAP IQ 会选择适用于当前查询或查询的部分的最快索引。但每增加一种索引类型都可能会显著增加对该表的空间要求。
FROM 子句”。)如果列名含有字母、数字和下划线以外的其它字符,则用引号 (“”) 将它引起来。 对于多列索引,只能指定 HG 和 CMP 索引类型。外键要求非唯一索引,组合外键要求非唯一的组合 HG 索引。在单列 HG 索引中,CHAR、VARCHAR、BINARY 和 VARBINARY 数据的长度不超过 5300 个字节。多列 HG 索引(唯一和不唯一两者皆可)可以包含最多 5297 个字节的单个 CHAR、VARCHAR 或 BINARY 列。
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 规范如何。
is on the mat并且通过使用缺省分隔符的 CASE IGNORE 设置来创建数据库,则此字符串中的下列单词会存储到 WD 索引中:cat is mat on the如果指定多个 DELIMITED BY 和 LIMIT 子句,则不会返回任何错误,但只使用每种类型的最后一个子句。
RETURN> 字符或十六进制 ASCII 代码 \x0a。 例如,子句 DELIMITED BY ' :;.\/t' 指定以下七个分隔符:space : ; . \ / t分隔符DELIMITED BY 子句的分隔符字符串制表符' '(键入 RETURN>)或 '\x0a'
CREATE INDEX 语句中指定的最大单词长度或缺省确定的最大单词长度超过列宽,则所用的最大单词长度会自动缩短至列宽。使用的最大允许单词长度越小,允许插入、删除和更新使用的空间会更小、时间会更短。空词(两个相邻的分隔符)将被自动忽略。创建 WD 索引后,使用创建时确定的分隔符和最大单词大小来解析在相应列中插入的所有内容。创建索引之后,将无法更改这些分隔符和最大单词大小。
CREATE CMP INDEX proj_curr_cmpON sales_data( projected_earnings, current_earnings )
dbspace Dsp5 中分配的。 CREATE HG INDEX id_hgON SalesOrderItems( ID ) IN Dsp5
CREATE HG INDEX item_prod_hgON Sales_OrderItems( ProductID)
CREATE WD INDEX earnings_wdON earnings_report_table(varchar)DELIMITED BY ‘ :;.’LIMIT 25
CREATE DTTM INDEX order_dttmON SalesOrders( OrderDate )
dbspace 中而此索引在 DAS dbspace 中,CREATE INDEX 语句将导致错误。如果父表不是 DAS dbspace 表,将无法在 DAS Dbspace 中创建表子组件。
CREATE INDEX 语句中指定索引所有者。索引将自动由定义了这些索引的表的所有者拥有。索引名称对每个所有者必须是唯一的。
CREATE INDEX 影响了当前正由其它连接修改的表,就会禁止该语句。但允许对正在同时添加索引的表进行查询。
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 字节的 CHAR 和 VARCHAR 数据创建缺省索引、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 数据的列创建索引。
CHAR 和 VARCHAR 数据创建缺省索引、CMP 索引或 WD 索引。
VARCHAR 数据创建缺省索引类型和 WD 索引类型。
FLOAT、REAL 或 DOUBLE 数据的列创建 HNG 索引或 CMP 索引。
TIME 数据类型的列创建 TIME 索引。
DATE 数据类型的列创建 DATE 索引。
TIMESTAMP 数据类型的列创建 DTTM 索引。
DATE、TIME 或 DTTM 索引。 多列连接键的最大宽度为 5KB(5300 字节)。允许的列数取决于 5KB 包含的列数。超过 255 字节的 CHAR 或 VARCHAR 数据不允许作为单列 HG、DATE、TIME 或 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 值。
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 命令会失败并生成错误消息必须提交局部临时表
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 系统特权。