【问题标题】:Move truncated records to another table in Postgresql 9.5将截断的记录移动到 Postgresql 9.5 中的另一个表
【发布时间】: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


【解决方案1】:

你需要使用类似的东西:

--Open your transaction

BEGIN;

--Prevent concurrent writes, but allow concurrent data access

LOCK TABLE table_a IN SHARE MODE;

--Copy the data from table_a to table_b, you can also use CREATE TABLE AS to do this

INSERT INTO table_b AS SELECT * FROM table_a;

--Zeroying table_a

TRUNCATE TABLE table_a;

--Commits and release the lock

COMMIT;

【讨论】:

  • 由于并发写入此表,我必须避免将其全部锁定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多