DBA 通过将 ONLINE 关键字作为 DROP INDEX 语句的最终规范将它包括在内,可以减少非独占错误的风险,并能增加有索引的表的可能性。当正在最小化互斥锁的持续时间时,ONLINE 关键字指示数据库服务器删除索引。当并发用户正在访问表时,可以删除索引。
缺省情况下,DROP INDEX 尝试将互斥锁放在索引的表上,以防止在正在删除索引时所有其它用户访问此表。如果另一用户已经锁定此表,或正以 Dirty Read 隔离级别访问此表,则 DROP INDEX 语句失败。
在发出 DROP INDEX ONLINE 语句之后,查询优化器不会考虑在后续的查询计划或成本估计中使用指定的索引,而且数据库服务器不支持在有索引的表上的任何其它 DDL 操作,直至已经删除了指定的索引之后。然而,在 DROP INDEX ONLINE 语句之前就已经启用的查询操作可以继续访问索引直至查询完成。
当没有其他用户正在访问索引时,数据库服务器删除索引,且 DROP INDEX ONLINE 语句终止执行。
缺省情况下,DROP INDEX ONLINE 语句不会无限期地等待要释放的锁。如果一个或多个并发会话持有表的锁,该语句可能会发生错误 -216 或 -113 而失败,除非您首先发出 SET LOCK MODE TO WAIT 语句以指定无限期等待。否则,DROP INDEX ONLINE 使用 DEADLOCK_TIMEOUT 配置参数指定的锁定的等待期,或者指定先前的 SET LOCK MODE 语句。要避免锁定错误,请在联机删除索引之前执行 SET LOCK MODE TO WAIT (没有特定的限制)。
不能使用 CREATE INDEX 语句声明一个已经具有相同标识的新索引,直至已经删除了指定索引之后。最多有一个 CREATE INDEX ONLINE 或 DROP INDEX ONLINE 语句可以在同一个表上并发地引用索引。
DROP INDEX IF EXISTS idx_01 ONLINE;