【问题标题】:Truncating part of a postgres table截断部分 postgres 表
【发布时间】:2019-01-17 02:12:35
【问题描述】:

我正在运行 Postgres 10.01 版

psql -V
psql (PostgreSQL) 10.5

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

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

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

任何建议都会有所帮助

【问题讨论】:

  • 将所有行插入到新表中,然后执行 INNER JOIN 删除
  • 不相关,但是:psql -V 打印命令行实用程序 psql 的版本。它不是 Postgres server 的版本。这只能通过运行select version(); 可靠地获得
  • DELETE 不会阻止插入
  • 如果你已经创建了一个分区表,那就很简单了。

标签: sql postgresql


【解决方案1】:

您需要分两步进行。

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

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

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

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

(确保在运行之前在新表中创建一个 id 索引)。

【讨论】:

    【解决方案2】:

    如果您只是想删除行,您就不能将删除视为一个事务。除非您的插入依赖于表中的现有数据,否则不应出现阻塞。

    【讨论】:

      猜你喜欢
      • 2020-11-03
      • 2013-11-25
      • 2022-01-18
      • 2015-12-14
      • 2014-03-25
      • 2016-12-31
      • 2015-11-15
      • 2013-11-03
      • 2011-02-19
      相关资源
      最近更新 更多