高效地修剪postgresql表
我有大约10个表,记录超过200万条,还有一个表有3000万条。我希望能够有效地从每个表中删除较旧的数据 我的一般算法是: 为每个大表创建一个临时表,并用更新的数据填充它 截断原始表 使用:insert into ORIGINABLE select*from tmp_table将tmp数据复制回原始表格 然而,复制数据的最后一步比我希望的要长。我曾想过删除原始表并使临时表永久化,但我丢失了约束/外键信息 如果直接从表中删除,则需要更长的时间。考虑到我需要保留所有外键和约束,有没有更快的方法删除旧数据高效地修剪postgresql表,postgresql,performance,foreign-keys,Postgresql,Performance,Foreign Keys,我有大约10个表,记录超过200万条,还有一个表有3000万条。我希望能够有效地从每个表中删除较旧的数据 我的一般算法是: 为每个大表创建一个临时表,并用更新的数据填充它 截断原始表 使用:insert into ORIGINABLE select*from tmp_table将tmp数据复制回原始表格 然而,复制数据的最后一步比我希望的要长。我曾想过删除原始表并使临时表永久化,但我丢失了约束/外键信息 如果直接从表中删除,则需要更长的时间。考虑到我需要保留所有外键和约束,有没有更快的方法删除旧
谢谢。最快的流程可能正是您所概述的: 将新数据复制到临时表中 删除索引和外键 扔掉那张旧桌子 将临时表复制回旧表名 重建索引和外键。
对绩效也有一些建议,这些建议可能适用,也可能不适用。但是,坦率地说,删除一个表要比删除数百万行快得多,因为每次删除都是逐元组执行的,而且在没有约束或索引的表中插入数百万行要快得多,因为每次插入记录都必须检查每个约束,更新每个索引;通过删除所有约束,可以将此限制为索引的单个构建和约束的单个验证。这些问题的标准解决方案通常涉及在适当的键上对表进行分区,以便在需要删除旧数据时,您可以简单地删除整个分区,这无疑是您将得到的最快的删除 然而,PostgreSQL中的分区并不像其他一些数据库那么容易-您需要使用触发器手动重新定位数据,并且有一些警告,例如没有全局主键 见