更新时间:2026-10-21 GMT+08:00
分享

DROP INDEX

功能描述

删除一个索引。

注意事项

索引的所有者、索引所在模式的所有者、拥有索引所在表的INDEX权限的用户或者被授予了DROP ANY INDEX权限的用户可以执行该操作,三权分立关闭时的系统管理员默认拥有此权限。

语法格式

1
2
DROP INDEX [ CONCURRENTLY ] [ IF EXISTS ] 
    index_name [, ...] [ CASCADE | RESTRICT ];

参数说明

  • CONCURRENTLY

    以不阻塞DML的方式在线删除索引(加四级锁)。删除索引时,一般会阻塞其他语句对该索引所依赖表的访问。加此关键字,可在删除过程中避免阻塞。

    • 删除索引指定CONCURRENTLY选项时,只能指定一个索引的名称, 并且不支持CASCADE选项。
    • 普通DROP INDEX命令可以在事务内执行,但是DROP INDEX CONCURRENTLY不可以在事务内执行。
    • 对于临时表,支持使用CONCURRENTLY关键字删除索引,但是实际删除过程中,采用的是阻塞式的删除方式,因为没有其他会话会并发访问临时表,并且阻塞式删除成本更低。
    • 与在线创建索引类似,在线删除索引也存在阶段需要等待索引对应表上相关的其他事务结束,因此可能出现锁超时问题,导致在线删除索引失败。
    • 与在线创建索引类似,由于需要等待表上相关的其他事务结束,在线删除索引可能会和其他DDL出现死锁问题,导致在线删除索引失败。具体原因是:在线删除索引持有四级锁,等待并发DDL事务结束;并发DDL持有事务锁,等待在线删除索引释放四级锁。
    • 当发生锁超时、死锁、数据库异常等故障或者用户取消操作时,可能造成在线删除索引失败,残留非法状态的索引。残留索引在CN、DN的状态可能不一致(比如CN为not valid状态,DN为valid状态;或者部分CN为valid状态,部分CN为not valid状态,DN为valid状态)或者残留索引在部分节点存在而其他节点不存在,但不会造成不一致问题。为避免占用系统资源,需尽快将其清理,可以继续使用DROP INDEX CONCURRENTLY或者DROP INDEX将非法索引删除,如果使用DROP INDEX CONCURRENTLY删除索引持续失败,可以使用DROP INDEX删除索引。
    • 在线删除索引时间与并发业务量、并发业务运行时间有关。无并发业务时,在线删除索引为秒级别;有并发业务时,需要额外等待某时刻正在运行的所有并发业务结束,因此在线删除索引时间要额外加上这些并发业务运行时间。
    • 分布式在线删除索引只支持btree和ubtree索引,不支持GSI。
    • 在执行DROP INDEX CONCURRENTLY期间,涉及该索引的Stream计划可能引发报错。建议在执行该操作前,通过SQL Patch或为相关SQL添加Hint的方式,禁用Stream计划,使其执行pgxc计划。
    • 生成WDR快照期间如果有在线删除索引操作,可能会出现Could not open relation with OID %u.报错导致WDR快照生成失败,此现象为预期内行为,待索引删除完成后重新生成WDR快照即可。
  • IF EXISTS

    判断指定的索引是否存在。

    • 如果指定的索引存在,则删除成功。
    • 如果指定的索引不存在,不会进行删除操作,仅产生一个NOTICE提示,用于告知指定索引不存在。

    在线创建、删除索引失败后,可能会导致部分节点中无法匹配到失败索引的元信息,DROP INDEX语句无法删除该索引,需要用DROP INDEX IF EXISTS进行删除。

  • index_name

    要删除的索引名。

    取值范围:已存在的索引。

  • CASCADE | RESTRICT
    可选,是否级联删除依赖于该索引的对象。未指定时,默认为RESTRICT。
    • CASCADE:允许级联删除依赖于该索引的对象。
    • RESTRICT:存在依赖于此索引的对象时,该索引无法被删除。

示例

--创建表。
gaussdb=# CREATE TABLE test1_index (id INT, name VARCHAR(20));

--创建索引。
gaussdb=# CREATE INDEX idx_test1 ON test1_index(id);

--删除索引。
gaussdb=# DROP INDEX IF EXISTS idx_test1 CASCADE;

--在线创建索引。
gaussdb=# CREATE INDEX CONCURRENTLY idx_test2 ON test1_index(name);

--在线删除索引。
gaussdb=# DROP INDEX CONCURRENTLY idx_test2;

--删除表。
gaussdb=# DROP TABLE test1_index;

相关链接

ALTER INDEX,CREATE INDEX

相关文档