我有大约10个表,超过200万条记录,一个有3000万条记录。我想有效地从每个表中删除旧数据。
我的一般算法是:
然而,复制数据的最后一步花费的时间比我想要的要长。我想删除原始表并使临时表“永久”,但我失去了约束/外键信息。
如果我直接从表中删除,则需要更长时间。鉴于我需要保留所有外键和约束,有没有更快的方法来删除旧数据?
感谢。
答案 0 :(得分:2)
最快的过程可能正如您所概述的那样:
The Postgres manual也有一些关于性能的建议,可能适用也可能不适用。但是,坦率地说,删除一个表比删除数百万行要快得多(因为每个删除都是由元组执行元组),并且将数百万行插入到没有约束或索引的表中(作为每个约束)要快得多必须检查并且必须为每个记录插入更新每个索引;通过删除所有约束,您可以将其限制为索引的单个构建和约束的单个验证。
答案 1 :(得分:1)
针对这些问题的“标准”解决方案通常涉及在适当的密钥上对表进行分区,这样当您需要删除旧数据时,您可以简单地删除整个分区 - 这肯定是您将获得的最快删除。
但是,PostgreSQL中的分区并不像其他一些数据库那么容易 - 您需要使用触发器手动重定位数据,并且有一些警告(例如没有全局主键)