Milovan Zogovic Asked: 2013-12-28 01:50:18 +0800 CST2013-12-28 01:50:18 +0800 CST 2013-12-28 01:50:18 +0800 CST 如何复制巨大的postgres表? 772 我有巨大的 postgres 表(10GB 数据 - 160M 记录)。表是静态的,没有对其执行的写操作。我想复制它,执行写入,重新索引它,然后使用单个快速事务删除旧事务并将新事务重命名为原始名称。 复制这么大的表的最快方法是什么? postgresql 2 个回答 Voted Best Answer Daniel Vérité 2013-12-28T05:25:40+08:002013-12-28T05:25:40+08:00 通常,复制表的最快方法很简单: CREATE TABLE table2 AS SELECT * FROM table1; 并行 INSERT 可能更快,但仅限于非常快的磁盘子系统(当数据在许多驱动器上交错时)。否则这会更慢。 完成修改table2后,它可以使用以下新名称: BEGIN; DROP TABLE table1; ALTER TABLE table2 RENAME TO table1; COMMIT; 该DROP TABLE命令需要一个独占锁,这会以您可能希望预期的方式影响并发阅读器: DROP将等待其他事务对表的任何挂起读取完成。 同时尝试读取该表的任何新事务都将等待,然后由于原始事务table1不再存在而失败。错误看起来像“无法打开与 OID oid的关系” 为避免第二个问题,您可以重命名table1 为old_table1 而不是删除它,然后仅在这些读者完成后才将其删除到事务之外。所以上面的顺序会变成: BEGIN; ALTER TABLE table1 RENAME TO old_table1; ALTER TABLE table2 RENAME TO table1; COMMIT; ... DROP TABLE old_table1; chrisdima 2020-02-26T19:15:42+08:002020-02-26T19:15:42+08:00 您可以使用这个开源重复数据删除器 - 使用 JDBC:https ://github.com/bmiller1009/deduper
通常,复制表的最快方法很简单:
并行 INSERT 可能更快,但仅限于非常快的磁盘子系统(当数据在许多驱动器上交错时)。否则这会更慢。
完成修改
table2
后,它可以使用以下新名称:该
DROP TABLE
命令需要一个独占锁,这会以您可能希望预期的方式影响并发阅读器:DROP
将等待其他事务对表的任何挂起读取完成。table1
不再存在而失败。错误看起来像“无法打开与 OID oid的关系”为避免第二个问题,您可以重命名
table1
为old_table1
而不是删除它,然后仅在这些读者完成后才将其删除到事务之外。所以上面的顺序会变成:您可以使用这个开源重复数据删除器 - 使用 JDBC:https ://github.com/bmiller1009/deduper