我有巨大的 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 的关系”为避免第二个问题,您可以将其重命名table1
为old_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)
归档时间: |
|
查看次数: |
26723 次 |
最近记录: |