2017-10-17 80 views
2

我曾尝试下面的命令为Postgres的(超级)用户和所有者用户:如何在PostgreSQL 9.6中删除索引?

Drop index <index_name>; 
Drop index <index_name> cascade; 
Drop index concurrently <index_name>; 

查询不给任何错误,但处于挂起状态,直到永远取消。

+2

你的语句是一般正常。您可能还有其他任务正在数据库中运行,从而阻止完成。 – clemens

+0

是的,情况可能如此。有什么方法可以找出哪个查询/会话正在使用索引? – user5579599

+3

https://wiki.postgresql.org/wiki/Lock_Monitoring –

回答

4

您的陈述一般都可以。还有其他进程在索引上锁定,防止完成丢弃语句。您可以看到积极的语句

SELECT * FROM pg_stat_activity; 

如果需要,您应该设置log_statement

编辑:pg_locks会向您提供有关特定锁:

SELECT a.datname, 
     c.relname, 
     l.transactionid, 
     l.mode, 
     l.GRANTED, 
     a.usename, 
     a.query, 
     a.query_start, 
     age(now(), a.query_start) AS "age", 
     a.pid 
    FROM pg_stat_activity a 
    JOIN pg_locks   l ON l.pid = a.pid 
    JOIN pg_class   c ON c.oid = l.relation 
    ORDER BY a.query_start; 
+1

是的,它的工作。关闭依赖会话后,我能够删除索引。 – user5579599

+0

'pg_locks'通常会提供更多信息。 –

+0

@CraigRinger:你说得对。我已经延长了我的答案。 – clemens