微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql – Postgres SET UNLOGGED需要很长时间

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

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

解决方法

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐