Postgresql 添加没有停机时间的列

Postgresql 添加没有停机时间的列,postgresql,thinking-sphinx,Postgresql,Thinking Sphinx,我需要在有1700万条记录的表中添加thinking sphinx delta列,然后我需要为该字段编制索引 DB是postgres,添加列将导致一个小时的停机时间,这是不可能的,因此任何关于如何更改表以使整个表不被锁定的建议/想法。我能想到的避免长表锁定的唯一解决方案是创建具有所需结构的新表。然后使用插入到。。。选择填充该表,重新创建所有索引(包括新索引),然后将新表重命名为旧表 重命名表可以在事务中完成,这样客户机就不会注意到这一点(尽管这可能需要一些时间,因为我认为重命名将等待它获得独占锁

我需要在有1700万条记录的表中添加thinking sphinx delta列,然后我需要为该字段编制索引


DB是postgres,添加列将导致一个小时的停机时间,这是不可能的,因此任何关于如何更改表以使整个表不被锁定的建议/想法。

我能想到的避免长表锁定的唯一解决方案是创建具有所需结构的新表。然后使用
插入到。。。选择
填充该表,重新创建所有索引(包括新索引),然后将新表重命名为旧表

重命名表可以在事务中完成,这样客户机就不会注意到这一点(尽管这可能需要一些时间,因为我认为重命名将等待它获得独占锁)

您还必须重新创建引用该表的外键(不确定其中涉及的锁定级别)


当然,只有当您有足够的空间,以便能够保存一份完整的表格副本时,才有可能做到这一点。

为什么您认为更新需要一个小时?我刚刚在一个有3400000行的生产表上做了一个测试。添加一个新列需要4.366毫秒,创建索引需要8725.777毫秒。如果在这期间没有人更新原始表