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