运行Postgres-9.5。我有一张大桌子,我正在ALTER TABLE table SET UNLOGGED
上。我已经删除了针对该表的所有外键约束,因为FK引用的表不能未记录。查询花了大约20分钟,一直消耗100%的CPU。我可以理解它需要花费很长时间来记录一个表,但是让它没有记录似乎并不困难......但是它呢?
有什么办法可以让你更快地设置一个未记录的表吗?
答案 0 :(得分:7)
SET UNLOGGED
涉及表重写,因此对于大型表,您可能需要花费很长时间。
正如你所说,似乎不应该让表格UNLOGGED
变得那么困难。简单地转换表并不是那么困难;复杂因素是需要使其安全可靠。 UNLOGGED
表有一个与之关联的附加文件(init fork),并且无法将此文件的创建与提交的其余部分同步。
相反,SET UNLOGGED
构建表的副本,附加一个init fork,然后交换新的relfilenode
,提交可以原子方式处理。一个更有效的实现是可能的,但不是没有改变未记录的表的表示(在SET UNLOGGED
之前已经有一段时间了)或者COMMIT
本身背后的逻辑,这两者都被认为对此过于干扰相对较小的特征。您可以在pgsql-hackers list上阅读设计背后的讨论。
如果您确实需要最大限度地减少停机时间,可以采用与SET UNLOGGED
类似的方法:创建一个新的UNLOGGED
表,复制所有记录,暂时锁定旧表同步最后几个更改,并在完成后用RENAME
交换新表。