安东尼·索托隆戈·莱昂:在Postgres表之间复制数据的最快方法

安东尼·索托隆戈·莱昂:在Postgres表之间复制数据的最快方法

💡 原文英文,约1900词,阅读约需7分钟。
📝

内容提要

这篇文章介绍了在Postgres中复制数据的最快方法。作者通过几个示例和结果展示了使用不同技术克隆数据的速度。其中包括使用IIS语句、CREATE TABLE AS命令、COPY命令、pg_bulkload工具等。作者发现,使用pg_bulkload工具的DIRECT选项是最快的克隆数据表的方法。此外,作者还提到了一些注意事项和优化建议。

🔎

延伸解读

UNLOGGED 表的性能权衡

将目标表设为 UNLOGGED 可绕过 WAL 写入,使 INSERT INTO SELECT 的耗时从约 12.8 秒降至 6.5 秒。但克隆完成后需执行 ALTER TABLE SET LOGGED 将其转回持久表,该操作耗时约 7.7 秒,总时间约 14.2 秒,反而比直接使用 LOGGED 表更慢。因此,若最终需要持久化,UNLOGGED 方案并不划算。

pg_bulkload DIRECT 模式的速度与风险

pg_bulkload 的 DIRECT 模式绕过共享缓冲区并跳过 WAL 日志,在测试中以 6.912 秒完成 2000 万行克隆,是所测方法中最快的。但代价是数据不写入 WAL,导致 PITR 和流复制无法同步这些数据。测试中主库有 2000 万行,而副本仅 136 行。若需 PITR 或复制,必须在加载后重新备份并重建备库。

CTAS 与 IIS 的细微差异

CREATE TABLE AS 的执行计划仅包含 SEQSCAN 节点,而 INSERT INTO SELECT 包含 INSERT 和 SEQSCAN 两个节点。这使得 CTAS 在测试中略快,执行时间约 11.9 秒,而 IIS 约 12.8 秒。但 CTAS 不会复制索引、约束或触发器,若目标表需要这些对象,需额外创建。

克隆含索引或触发器的表时的优化建议

如果待克隆的表包含索引或触发器,建议在克隆前删除目标表的索引和触发器,并优化列顺序。同时可考虑在克隆期间禁用目标表的 autovacuum,待克隆完成后再重新启用。这些调整有助于减少写入开销,提升克隆速度。

❓

Q&A

在Postgres中,复制数据的最快方法是什么?

使用pg_bulkload工具的DIRECT选项是最快的克隆数据表的方法,执行时间为6.912秒。

使用INSERT INTO SELECT语句复制数据的执行时间是多少?

使用INSERT INTO SELECT语句进行数据克隆的执行时间为12779.611毫秒。

CREATE TABLE AS命令的执行时间与INSERT INTO SELECT相比如何?

CREATE TABLE AS命令的执行时间为11900.089毫秒,性能略优于INSERT INTO SELECT。

使用UNLOGGED表加快数据克隆的效果如何?

将目标表设置为UNLOGGED可以加快克隆过程,但转换为LOGGED表的成本较高,总过程耗时14.2秒。

COPY命令在数据克隆中有什么优势?

COPY命令可以有效地在数据库中导入和导出数据,但可能会产生延迟。

pg_bulkload工具的BUFFERED选项性能如何?

使用BUFFERED选项时,pg_bulkload的性能与INSERT INTO SELECT和CREATE TABLE AS相似,执行时间约为12.901秒。

🏷️

标签

➡️

继续阅读