【发布时间】:2017-09-23 19:26:08
【问题描述】:
问题如下:从一个表中删除所有记录,然后将它们插入到另一个表中。
我有一个按日期标准分区的表。为了避免对每条记录一个一个地进行分区,我将数据收集在一个表中,并定期将它们移动到另一个表中。复制的记录必须从第一个表中删除。我正在使用DELETE query with RETURNING,但副作用是 autovacuum 需要做很多工作来清理原始表中的混乱。
我正在尝试实现相同的效果(复制和删除记录),但没有为真空机制创建额外的工作。
当我删除所有行时(通过不带 where 条件的删除),我在考虑 TRUNCATE,但它不支持 RETURNING 子句。另一个想法是以某种方式配置表,在删除操作时自动从页面中删除元组,而无需等待真空,但我没有找到是否可能。
您能提出一些可以用来解决我的问题的建议吗?
【问题讨论】:
-
我不明白你需要怎么回到这里?..为什么不只是
begin; insert into part_table select * from short_table; truncate short_table; end?.. -
@VaoTsun:如果有并发写入,你需要一个表锁来避免数据丢失。
-
@Vao Tsun,原因与 Nick Barnes 所写的完全一样。有并发写入。通过使用 delete 并返回,我确定我没有违反数据一致性。我无法锁定表,因为它会阻塞其他模块。
-
确实 - 在我的示例中,您需要在事务中锁定表
-
我不明白为什么你在插入的时候不能对数据进行分区。插入数据的机制是什么?
标签: postgresql truncate vacuum