有效修剪postgresql表

时间:2010-04-19 23:16:23

标签: postgresql performance foreign-keys

我有大约10个表,超过200万条记录,一个有3000万条记录。我想有效地从每个表中删除旧数据。

我的一般算法是:

  • 为每个大表创建一个临时表,并用更新的数据填充它
  • 截断原始表格
  • 使用以下命令将tmp数据复制回原始表:“insert into originaltable(select * from tmp_table)”

然而,复制数据的最后一步花费的时间比我想要的要长。我想删除原始表并使临时表“永久”,但我失去了约束/外键信息。

如果我直接从表中删除,则需要更长时间。鉴于我需要保留所有外键和约束,有没有更快的方法来删除旧数据?

感谢。

2 个答案:

答案 0 :(得分:2)

最快的过程可能正如您所概述的那样:

  1. 将新数据复制到临时表中
  2. 删除索引和外键
  3. 放下旧桌子
  4. 将临时表复制回旧表名称
  5. 重建索引和外键。
  6. The Postgres manual也有一些关于性能的建议,可能适用也可能不适用。但是,坦率地说,删除一个表比删除数百万行要快得多(因为每个删除都是由元组执行元组),并且将数百万行插入到没有约束或索引的表中(作为每个约束)要快得多必须检查并且必须为每个记录插入更新每个索引;通过删除所有约束,您可以将其限制为索引的单个构建和约束的单个验证。

答案 1 :(得分:1)

针对这些问题的“标准”解决方案通常涉及在适当的密钥上对表进行分区,这样当您需要删除旧数据时,您可以简单地删除整个分区 - 这肯定是您将获得的最快删除。

但是,PostgreSQL中的分区并不像其他一些数据库那么容易 - 您需要使用触发器手动重定位数据,并且有一些警告(例如没有全局主键)

请参阅PostgreSQL manual on Partitioning