DBA 将 ONLINE 关键字包含在 CREATE INDEX 语句末尾的规范中,从而降低非互斥存取错误的风险,提高被索引表的可用性。ONLINE 关键字指示数据库服务器在最小化排它锁持续时间时创建该索引,以致于并行用户存取该表时能创建索引。
缺省情况下,CREATE INDEX 试图在被索引的表上放置互斥锁以防止创建该索引时其它用户存取该表。如果另一个用户已经锁定该表或者当前存取的表处于 Dirty Read 隔离级别,则 CREATE INDEX 语句失败。
即使其它用户正在该被索引的表的上执行 Dirty Read 和 DML 操作,数据库服务器仍建立索引。一发出 CREATE INDEX ONLINE 语句,该新索引将对用于查询计划或成本评估的查询优化器不可见,并且数据库服务器也不支持任何在该已建立索引的表上的 DDL 操作,直到正确地构建了指定的索引。此时,数据库服务器在用新索引的信息更新系统目录的同时暂时地锁定该表。
此外,如果在该表上定义了主键,且一个或多个并发的会话正在拥有引用该主键的外键约束的子表上执行 DML 操作,则 CREATE INDEX ONLINE 操作产生错误 -710 。在此索引上创建 ONLINE 之前,您必须等待直到所有的具有子表的用户会话已完成。
CREATE UNIQUE INDEX IF NOT EXISTS idx_1 ON customer(lname) ONLINE;
如果正在创建此索引时,有其它用户在 customer 表中插入了新行,其中 lname 不唯一,则数据库服务器将在它完成创建该新的 idx_1 索引并在系统目录表中注册此索引后发出一个错误。
术语联机索引指的是数据库在使用 ONLINE 关键字创建或删除索引时所遵循的锁定策略,而不是索引在完成创建(或销毁)后它继续拥有的属性。然而此术语也出现在一些错误消息中,在恢复或复原操作中,数据库服务器将把任何您创建为联机索引的索引重新创建为联机索引。
只有 CREATE INDEX ONLINE 或 DROP INDEX ONLINE 语句可以在同一表或具有相同标识符的联机索引上并发地引用联机索引。