CREATE INDEX¶
在现有 混合表 中创建新的二级索引并使用数据填充索引。
索引创建是一种在线(非阻塞)操作。在构建索引时,混合表仍将可用于 SELECT 和 DML 语句。但是,如果混合表未处于活跃使用状态且停机时间不是问题,建议您使用定义的索引重新创建混合表。另请参阅 创建混合表。
语法¶
CREATE [ OR REPLACE ] INDEX [ IF NOT EXISTS ] <index_name>
ON <table_name>
( <col_name> [ , <col_name> , ... ] )
参数¶
index_name
指定新索引的标识符。您必须为给定混合表上的每个新索引指定一个唯一的名称。混合表上不能存在具有相同名称或相同有序列集的其他二级索引。
table_name
指定用于保存新索引的现有混合表的名称。
col_name
指定混合表中现有列的名称。创建表时定义的索引列的所有要求都适用于列标识符。
混合表不能包含在相同有序列集上定义的两个二级索引。
具有 地理空间数据类型 (VECTOR) 的列在二级索引中不受支持。
访问控制要求¶
要创建索引,您必须使用对混合表具有 OWNERSHIP 权限的角色。
使用说明¶
CREATE INDEX 命令不能用于添加外键、主键或唯一键约束。
创建新索引不会同时阻止其他工作负载。混合表可用于并发 SELECT 和 DML 语句。
在任何时候,每个混合表都只能运行一个活动的索引构建操作。
您可以使用 SHOW INDEXES 跟踪索引构建的进度。STATUS 列可以取以下值:
ACTIVE
:索引已完成,可用于检索数据。SUSPENDED
:索引仅更新,不用于检索数据。BUILD FAILURE
:索引构建过程发生错误。您需要删除并重新创建索引。BUILD IN PROGRESS
:索引正在构建中国,不用于检索数据。
您可以使用 DROP INDEX 和 CREATE INDEX 重建状态为
SUSPENDED
、BUILD FAILURE
或BUILD IN PROGRESS
的非活动索引。如果要删除的列属于正在构建的索引,请先通过删除索引来停止索引构建,然后再删除该列。如果在删除索引之前尝试删除列,您将收到以下错误消息:
Column '<col_name>' cannot be dropped because it is used by index '<index-name>'.
仅在发布 CREATE INDEX 语句时同一表上具有 DMLs 的所有活动事务完成之后,在线索引构建才能取得进展。如果其中任何事务处于空闲状态超过 5 分钟,默认情况下将中止。请参阅 事务。
在索引构建过程中,任何 DML 都会执行对新索引的写入操作,但不使用该索引检索数据。
在 CREATE INDEX 命令完成后开始执行的少量并发 DMLs 可能会失败并返回以下错误:
DML was unaware of concurrent DDL. Please retry this query.
如果中止的 DML 语句属于多语句事务,则仅当 TRANSACTION_ABORT_ON_ERROR 参数设置为 TRUE 时,事务才会回滚。
仅当索引构建过程成功完成并且索引的状态为
ACTIVE
时,才会使用新创建的索引检索数据。
示例¶
要运行以下 CREATE INDEX 示例,请首先创建并加载混合表。
CREATE OR REPLACE HYBRID TABLE mytable (
pk INT PRIMARY KEY,
val INT,
val2 INT
);
INSERT INTO mytable SELECT seq, seq+100, seq+200
FROM (SELECT seq8() seq FROM TABLE(GENERATOR(rowcount => 100)) v);
现在您可以在表上创建索引。
CREATE OR REPLACE INDEX vidx ON mytable (val);
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
如果在构建索引时失败,SHOW INDEXES 命令会报告以下状态:
BUILD FAILURE Index build failed. Please drop the index and re-create it.
如果您决定停止索引构建,请使用 DROP INDEX 命令:
DROP INDEX mytable.vidx;
+-------------------------------------+
| status |
|-------------------------------------|
| Statement executed successfully. |
+-------------------------------------+