加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – Postgres SET UNLOGGED需要很长时间

发布时间:2020-12-13 16:00:21 所属栏目:百科 来源:网络整理
导读:运行Postgres-9.5.我有一个大表,我正在做ALTER TABLE表SET UNLOGGED.我已经删除了针对该表的所有外键约束,因为FK引用的表不能未记录.查询花了大约20分钟,一直消耗100%的CPU.我可以理解它需要花费很长时间来记录一个表,但是让它不被记录似乎并不困难……但是
运行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创建新表.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读