PostgreSQL – 删除索引
在 PostgreSQL 中,DROP INDEX语句用于删除现有索引。
Syntax:
DROP INDEX [ CONCURRENTLY]
[ IF EXISTS ] index_name
[ CASCADE | RESTRICT ];
我们来分析一下上面的语法:
- index_name :这用于 在 DROP INDEX子句后指定要删除的索引的名称。
- 如果存在:尝试删除不存在的索引将导致错误。为避免这种情况,您可以使用IF EXISTS选项。如果您使用 IF EXISTS删除不存在的索引,PostgreSQL 会发出通知。
- CASCADE :如果索引具有依赖对象,则使用CASCADE选项自动删除这些对象以及依赖于这些对象的所有对象。
- RESTRICT: RESTRICT选项指示 PostgreSQL 拒绝删除索引,如果任何对象依赖它。该DROP INDEX使用缺省是RESTRICT。
- CONCURRENTLY:当您执行 DROP INDEX 语句时,PostgreSQL 会获取该表的排他锁并阻止其他访问,直到索引删除完成。要强制命令在删除索引之前等待冲突事务完成,您可以使用 CONCURRENTLY 选项。
出于示例的目的,我们将使用演员 用于演示的示例数据库中的表。
例子:
以下语句为first_name 创建索引 演员专栏 桌子:
CREATE INDEX idx_actor_first_name
ON actor (first_name);
有时,查询优化器不使用索引。例如,以下语句查找名为“ John”的演员:
SELECT * FROM actor
WHERE first_name = 'John';
查询未使用idx_actor_first_name 之前定义的索引如以下 EXPLAIN 语句中所述:
EXPLAIN SELECT *
FROM actor
WHERE first_name = 'John';
这是因为查询优化器认为只扫描整个表来定位行更为优化。因此, idx_actor_first_name在这种情况下没有用,我们需要将其删除:
DROP INDEX idx_actor_first_name;
输出: