我有超过200万张唱片的10张桌子和3000万张。我希望有效地从每个表中删除旧数据。
我的一般算法是:
为每个大表创建一个临时表,并用更新的数据填充它
截断原始表
使用“insert into original table(select*from tmp_table)”将tmp数据复制回原始表
但是,复制数据的最后一步比我希望的要长。我想删除原始表并使临时表“永久”,但是我丢失了约束/外键信息。
如果直接从表中删除,则需要更长的时间。考虑到我需要保留所有外键和约束,有没有更快的方法删除旧数据?
谢谢。
最佳答案
最快的过程可能与您所描述的完全一样:
将新数据复制到临时表中
删除索引和外键
放下旧桌子
将临时表复制回旧表名
重建索引和外键。
The Postgres manual对绩效也有一些建议,可能适用,也可能不适用。但是,坦率地说,删除一个表要比删除数百万行快得多(因为每次删除都是逐元组执行的),并且在没有约束或索引的表中插入数百万行要快得多(因为必须检查每个约束,并且必须为每次记录插入更新每个索引;删除所有约束,将其限制为索引的单个生成和约束的单个验证)。
关于postgresql - 有效地修剪PostgreSQL表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2671557/