截断Postgres表的一部分

时间:2019-01-16 17:23:00

标签: sql postgresql

我正在运行Postgres 10.01版

psql -V
psql (PostgreSQL) 10.5

我有一个包含约2.5亿行的表mytable-我的目标是创建一个新表newtable并将约一半的mytable复制到newtable({ {1}}),然后删除我从SELECT * WHERE time > '2019-01-01

复制的记录

当然,我想将所有索引保留在mytable

mytable中最有效的命令是什么? psql很有效,但是会删除所有行。 TRUNCATE TABLE可能会花费很多时间并阻止插入的发生(每10分钟安排一次INSERTS)

任何建议都会有所帮助

2 个答案:

答案 0 :(得分:1)

您需要分两步进行。

首先,将行复制到新表中。您可以使用CREATE..AS SELECT语句(但是此后您需要在新表上手动重新创建索引和其他对象,例如约束)。

CREATE TABLE  new_table
AS SELECT * FROM old_table WHERE time > '2019-01-01

然后,从旧表中删除记录。看起来一种有效的方法是使用DELETE ... USING语法来联接新表。假设您有一个名为id的主键:

DELETE FROM old_table o
USING new_table n
WHERE n.id = o.id

(在运行此代码之前,请确保在新表中的ID上创建索引)。

答案 1 :(得分:0)

如果您只是尝试删除行,则不能仅将删除视为事务。除非您的插入内容依赖于表中的现有数据,否则不应有阻塞。