我正在运行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)
任何建议都会有所帮助
答案 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)
如果您只是尝试删除行,则不能仅将删除视为事务。除非您的插入内容依赖于表中的现有数据,否则不应有阻塞。