Postgresql 更改表以在有限的磁盘空间上添加新列
我有一个关于操作主表的问题:我需要向其中添加一个新列,但是已经有5000多万个条目需要更新。Postgresql 更改表以在有限的磁盘空间上添加新列,postgresql,alter-table,Postgresql,Alter Table,我有一个关于操作主表的问题:我需要向其中添加一个新列,但是已经有5000多万个条目需要更新。 如果我不将数据存储在一个小型ssd上,而这个ssd已经被数据库填满了一半多一点,那么这就像一个alter表一样简单。 alter表格无法完成,因为它创建了表格的一个副本,然后才替换原始表格 我的ssd驱动器上无法安装两个副本,因此是否可以直接在原始表上操作,或使用另一个驱动器作为临时表? 或者我应该使用另一台计算机在更大的驱动器上更改我的表,然后只传输回我的ssd服务器 提前谢谢 PS:时间不是一个真正
如果我不将数据存储在一个小型ssd上,而这个ssd已经被数据库填满了一半多一点,那么这就像一个alter表一样简单。
alter表格无法完成,因为它创建了表格的一个副本,然后才替换原始表格 我的ssd驱动器上无法安装两个副本,因此是否可以直接在原始表上操作,或使用另一个驱动器作为临时表? 或者我应该使用另一台计算机在更大的驱动器上更改我的表,然后只传输回我的ssd服务器 提前谢谢
PS:时间不是一个真正的问题,它在alpha中是一个几乎没有用户的非实时系统,所以我可以在几个小时内把所有东西都取下来(感谢互联网上的上帝!)根据我的快速谷歌搜索,Postgres不支持inplace
add column
。由于时间对您来说不是问题,您可以通过使用新架构创建新表,然后使用插入将前100000行从旧表复制到新表来模拟inplaceadd column
。。。选择,然后从旧表中删除前100000行[1],并重复此过程,直到复制整个表。最后,只需删除旧表并重命名新表。这样,空间开销将始终保持不变
[1] 如果列没有默认值且为空,则PostgreSQL可以就地添加列 因此:使用与在高并发情况下处理它相同的方法,但不使用用于并发处理的触发器
不带任何altertable。。。添加列…
或默认值
非空
添加altertable。。。更改列。。。默认…
如果有默认值
成批更新表格以设置值<代码>真空每批之间的表格。请勿使用UPDATE
全真空
。每个批都必须是一个新的、单独的事务,在
之前提交真空
- 如果需要,
altertable。。。更改列。。。所有行都设置了值后不为空