0

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

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

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

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

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

4

1 回答 1

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;
于 2017-04-26T12:39:36.593 回答