我有一个很长的运行功能,这是一个导入过程,它目前正在运行。它已经运行了10个小时,根据我的计算 - 大约需要16-24个小时才能完成。
但是,它花费这么长时间的原因之一是因为它用于查找(以及写入)的其中一个表没有正确编入索引。
我无法中断该功能,因为这会导致它回滚事务并撤消其最后10个小时的工作。但是,我在中间操作时无法创建索引,因为它保留了表上的锁。
有什么方法可以强制Postgres获取表上的显式锁并创建索引(在创建函数时暂停函数执行)?
如果没有,无论如何我是否可以在没有的情况下中断功能,让它回滚到目前为止所做的工作?
答案 0 :(得分:1)
你可以创建索引concurrently
,这需要更长的时间来构建索引,但允许在创建索引时对表进行并发访问。
然而,这仍然无法帮助您,因为运行语句不会突然改变其“在飞行中”执行计划以切换到使用索引的执行计划。
不,声明总是原子的。如果语句被取消,则到目前为止所做的所有工作都将被回滚。
据我所知,你有两种选择: