强制Postgres索引创建

时间:2016-02-02 08:48:23

标签: database postgresql postgresql-9.3 database-administration

我有一个很长的运行功能,这是一个导入过程,它目前正在运行。它已经运行了10个小时,根据我的计算 - 大约需要16-24个小时才能完成。

但是,它花费这么长时间的原因之一是因为它用于查找(以及写入)的其中一个表没有正确编入索引。

我无法中断该功能,因为这会导致它回滚事务并撤消其最后10个小时的工作。但是,我在中间操作时无法创建索引,因为它保留了表上的锁。

有什么方法可以强制Postgres获取表上的显式锁并创建索引(在创建函数时暂停函数执行)?

如果没有,无论如何我是否可以在没有的情况下中断功能,让它回滚到目前为止所做的工作?

1 个答案:

答案 0 :(得分:1)

可以创建索引concurrently,这需要更长的时间来构建索引,但允许在创建索引时对表进行并发访问。

然而,这仍然无法帮助您,因为运行语句不会突然改变其“在飞行中”执行计划以切换到使用索引的执行计划。

不,声明总是原子的。如果语句被取消,则到目前为止所做的所有工作都将被回滚。

据我所知,你有两种选择:

  1. 等待该过程完成
  2. 杀死导入并重新运行它,希望一旦索引到位,它将比剩余的10个小时运行得更快。