为什么PostgreSQL同时创建索引永远不会取得进展?

时间:2018-02-09 17:13:31

标签: postgresql

什么是在PostgreSQL中同时创建索引的原因"挂起",即它似乎永远不会完成?通过"永远"我的意思是在24小时内还没有完成。以下是详细信息。

我在这张桌子上:

               Table "public.user_verifying_attempts"
     Column      |            Type             |     Modifiers      
-----------------+-----------------------------+--------------------
 user_id         | integer                     | not null
 type            | userverificationtype        | not null
 value           | text                        | not null
 code            | character(10)               | not null
 attempts        | integer                     | default 0
 emails_sent     | integer                     | not null default 0
 last_email_sent | timestamp without time zone | 

它有大约7.5M的行。我试图通过将此语句提交到控制台(psql)来创建索引:

create index concurrently user_verifying_attempts_code_value_idx on user_verifying_attempts (code)';

我认为没有证据表明此索引创建正在等待“闲置在交易中”#39;过程,我看不到pg_stat_activity中有任何相关的证据。

此外,我实际上是在本周早些时候在我们的生产数据库的副本上以这种方式创建了这个索引,它在〜90秒内完成。这与我上周在不同但略大的表格上创建的另一个索引一致,无论是在制作还是副本上。这些信息给我的是一个粗略的数量级估计,我应该等多久。分钟,绝对。小时,也许吧。但是,天?有些事情是错的。

最后,我将maintenance_work_mem从默认的16MB设置为1GB(主机拥有~160GB的内存)。

1 个答案:

答案 0 :(得分:0)

此表user_verifying_attempts上可能存在因某些其他事务而未释放的锁定。扫描pg_locks表以查看是否有任何有趣的内容