将截断的记录移动到Postgresql 9.5中的另一个表

时间:2017-04-26 11:51:07

标签: postgresql truncate vacuum

问题如下:从一个表中删除所有记录,然后将它们插入另一个表。

我有一个按日期标准分区的表。为了避免逐个分区每个记录,我将数据收集在一个表中,并定期将它们移动到另一个表中。必须从第一个表中删除复制的记录。我正在使用DELETE query with RETURNING,但副作用是autovacuum正在做很多工作来清理原始表中的混乱。

我正在尝试达到相同的效果(复制和删除记录),但没有为真空机制创建额外的工作。

当我删除所有行时(通过删除而没有条件),我在考虑TRUNCATE,但它不支持RETURNING子句。另一个想法是以某种方式配置表,在删除操作时自动从页面上删除元组,而不是等待真空,但我没有找到是否可能。

你能提出一些我可以用来解决问题的建议吗?

1 个答案:

答案 0 :(得分: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;