如何复制巨大的postgres表?

Mil*_*vic 30 postgresql

我有巨大的 postgres 表(10GB 数据 - 160M 记录)。表是静态的,没有对其执行写操作。我想复制它,执行写入,重新索引它,然后使用单个快速事务删除旧的并将新的重命名为原始名称。

复制如此巨大的表的最快方法是什么?

Dan*_*ité 56

通常,复制表的最快方法很简单:

CREATE TABLE table2 AS SELECT * FROM table1;
Run Code Online (Sandbox Code Playgroud)

并行插入可能更快,但仅适用于非常快的磁盘子系统(当数据在许多驱动器上交错时)。否则这会更慢。

完成修改后table2,它可以使用新名称:

BEGIN;
DROP TABLE table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

DROP TABLE命令需要一个排他锁,它以您可能希望预期的方式影响并发读取器:

  • DROP 将等待来自其他事务的表上的任何挂起读取完成。
  • 同时尝试读取该表的任何新事务都将使其处于等待状态,然后由于原始事务table1不再存在而失败。错误看起来像“无法打开与 OID oid 的关系”

为避免第二个问题,您可以将其重命名table1old_table1 而不是删除它,然后仅在事务之外稍后在这些读者完成它时删除它。所以上面的序列将变成:

BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;
Run Code Online (Sandbox Code Playgroud)

  • 谢啦。这正是我正在寻找的那种解释。再次感谢! (2认同)