Postgres SET UNLOGGED需要很长时间

时间:2017-02-02 19:04:27

标签: postgresql alter-table postgresql-9.5

运行Postgres-9.5。我有一张大桌子,我正在ALTER TABLE table SET UNLOGGED上。我已经删除了针对该表的所有外键约束,因为FK引用的表不能未记录。查询花了大约20分钟,一直消耗100%的CPU。我可以理解它需要花费很长时间来记录一个表,但是让它没有记录似乎并不困难......但是它呢?

有什么办法可以让你更快地设置一个未记录的表吗?

1 个答案:

答案 0 :(得分:7)

SET UNLOGGED涉及表重写,因此对于大型表,您可能需要花费很长时间。

正如你所说,似乎不应该让表格UNLOGGED变得那么困难。简单地转换表并不是那么困难;复杂因素是需要使其安全可靠。 UNLOGGED表有一个与之关联的附加文件(init fork),并且无法将此文件的创建与提交的其余部分同步。

相反,SET UNLOGGED构建表的副本,附加一个init fork,然后交换新的relfilenode,提交可以原子方式处理。一个更有效的实现是可能的,但不是没有改变未记录的表的表示(在SET UNLOGGED之前已经有一段时间了)或者COMMIT本身背后的逻辑,这两者都被认为对此过于干扰相对较小的特征。您可以在pgsql-hackers list上阅读设计背后的讨论。

如果您确实需要最大限度地减少停机时间,可以采用与SET UNLOGGED类似的方法:创建一个新的UNLOGGED表,复制所有记录,暂时锁定旧表同步最后几个更改,并在完成后用RENAME交换新表。