Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
高效地修剪postgresql表_Postgresql_Performance_Foreign Keys - Fatal编程技术网

高效地修剪postgresql表

高效地修剪postgresql表,postgresql,performance,foreign-keys,Postgresql,Performance,Foreign Keys,我有大约10个表,记录超过200万条,还有一个表有3000万条。我希望能够有效地从每个表中删除较旧的数据 我的一般算法是: 为每个大表创建一个临时表,并用更新的数据填充它 截断原始表 使用:insert into ORIGINABLE select*from tmp_table将tmp数据复制回原始表格 然而,复制数据的最后一步比我希望的要长。我曾想过删除原始表并使临时表永久化,但我丢失了约束/外键信息 如果直接从表中删除,则需要更长的时间。考虑到我需要保留所有外键和约束,有没有更快的方法删除旧

我有大约10个表,记录超过200万条,还有一个表有3000万条。我希望能够有效地从每个表中删除较旧的数据

我的一般算法是:

为每个大表创建一个临时表,并用更新的数据填充它 截断原始表 使用:insert into ORIGINABLE select*from tmp_table将tmp数据复制回原始表格 然而,复制数据的最后一步比我希望的要长。我曾想过删除原始表并使临时表永久化,但我丢失了约束/外键信息

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


谢谢。

最快的流程可能正是您所概述的:

将新数据复制到临时表中 删除索引和外键 扔掉那张旧桌子 将临时表复制回旧表名 重建索引和外键。
对绩效也有一些建议,这些建议可能适用,也可能不适用。但是,坦率地说,删除一个表要比删除数百万行快得多,因为每次删除都是逐元组执行的,而且在没有约束或索引的表中插入数百万行要快得多,因为每次插入记录都必须检查每个约束,更新每个索引;通过删除所有约束,可以将此限制为索引的单个构建和约束的单个验证。

这些问题的标准解决方案通常涉及在适当的键上对表进行分区,以便在需要删除旧数据时,您可以简单地删除整个分区,这无疑是您将得到的最快的删除

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