我正在尝试将具有 50M 记录的表转储到文件中,我的目标是减少执行此操作的时间。我通常使用COPY metrics TO 'metrics.csv' DELIMITER ',' CSV;
这在最好的情况下可能需要一个小时。我也有兴趣以某种纯格式导出数据(避免使用pd_dump
目录)。
其中一个想法是通过条件或游标以某种方式访问此表,将整个表拆分为相等大小的块,因此您可以同时执行例如 2 个复制查询,将时间减少到一半。
例子:
COPY (SELECT * FROM metrics WHERE id < 25000000) TO 'metrics_1.csv' DELIMITER ',' CSV;
COPY (SELECT * FROM metrics WHERE id >= 25000000) TO 'metrics_2.csv' DELIMITER ',' CSV;
在这些条件下创建的部分索引会有所帮助吗?
有什么想法是实现表的部分复制转储的好方法吗?还有其他解决方案可以更快地转储此表吗?
Postgresql 11 / 100GB RAM / 20 核。
在与 IO 边界进行一些并行化之后,COPY
似乎不再是瓶颈。