ALTER TABLE 在有限的磁盘 space 上添加新列
ALTER TABLE to add new column on limited disk space
我有一个关于操纵我的主table的问题:我需要在其中添加一个新列,但是已经有超过 5000 万个条目需要更新。
如果我没有将我的数据存储在一个已经被数据库填充了一半多的小型 ssd 上,它会像 alter table 一样简单。
更改 table 无法完成,因为它创建了 table 的副本,然后才替换原始文件。
我的 ssd 驱动器放不下两份,所以是否可以直接在原始 table 上操作,或者使用另一个驱动器作为临时 table?
或者我应该使用另一台计算机在更大的驱动器上更改我的 table,然后只传输回我的 ssd 服务器?
提前致谢!
PS: 时间不是真正的问题,它是一个非实时的alpha系统,几乎没有用户,所以我可以在几个小时内删除所有内容(感谢互联网大神!)
根据我的快速谷歌搜索,Postgres 不支持就地 add column
。由于时间对您来说不是问题,您可以通过使用新架构创建新 table 来模拟就地 add column
,然后将前 100000 行从旧 table 复制到新 table 使用 INSERT ... SELECT
,然后从旧 table 中删除前 100000 行 [1],并重复此过程,直到整个 table 被复制。然后在最后删除旧的 table 并重命名新的 table。这样 space 开销将始终保持不变。
[1] How do I delete a fixed number of rows with sorting in PostgreSQL?
如果该列没有 DEFAULT
且为空,则 PostgreSQL 可以就地执行 ADD COLUMN
。
因此:使用与在高并发情况下处理它相同的方法,但没有用于并发处理它的触发器。
ALTER TABLE ... ADD COLUMN ...
没有任何 DEFAULT
或 NOT NULL
ALTER TABLE ... ALTER COLUMN ... DEFAULT ...
添加 DEFAULT
如果有
UPDATE
table分批设置行值。 VACUUM
每批之间 table。 不要 使用VACUUM FULL
。每个批次必须是在 VACUUM
. 之前提交的新的单独事务
- 如果需要,
ALTER TABLE ... ALTER COLUMN ... NOT NULL
在所有行都设置值后
我有一个关于操纵我的主table的问题:我需要在其中添加一个新列,但是已经有超过 5000 万个条目需要更新。
如果我没有将我的数据存储在一个已经被数据库填充了一半多的小型 ssd 上,它会像 alter table 一样简单。
更改 table 无法完成,因为它创建了 table 的副本,然后才替换原始文件。
我的 ssd 驱动器放不下两份,所以是否可以直接在原始 table 上操作,或者使用另一个驱动器作为临时 table? 或者我应该使用另一台计算机在更大的驱动器上更改我的 table,然后只传输回我的 ssd 服务器?
提前致谢!
PS: 时间不是真正的问题,它是一个非实时的alpha系统,几乎没有用户,所以我可以在几个小时内删除所有内容(感谢互联网大神!)
根据我的快速谷歌搜索,Postgres 不支持就地 add column
。由于时间对您来说不是问题,您可以通过使用新架构创建新 table 来模拟就地 add column
,然后将前 100000 行从旧 table 复制到新 table 使用 INSERT ... SELECT
,然后从旧 table 中删除前 100000 行 [1],并重复此过程,直到整个 table 被复制。然后在最后删除旧的 table 并重命名新的 table。这样 space 开销将始终保持不变。
[1] How do I delete a fixed number of rows with sorting in PostgreSQL?
如果该列没有 DEFAULT
且为空,则 PostgreSQL 可以就地执行 ADD COLUMN
。
因此:使用与在高并发情况下处理它相同的方法,但没有用于并发处理它的触发器。
ALTER TABLE ... ADD COLUMN ...
没有任何DEFAULT
或NOT NULL
ALTER TABLE ... ALTER COLUMN ... DEFAULT ...
添加DEFAULT
如果有UPDATE
table分批设置行值。VACUUM
每批之间 table。 不要 使用VACUUM FULL
。每个批次必须是在VACUUM
. 之前提交的新的单独事务
- 如果需要,
ALTER TABLE ... ALTER COLUMN ... NOT NULL
在所有行都设置值后