加速批量加载

本页目录

如果你需要加载大量数据,以下技巧可以帮助你提升加载速度:

1) 使用COPY

使用 COPY 加载数据,它针对批量加载进行了优化。

2) 减少检查点频率

考虑暂时增加 max_wal_size 和 checkpoint_timeout 的值。

调整这些参数不需要重启。更大的值意味着发生故障时恢复时间会更长,但好处是检查点发生的频率减少,因此:

3) 增加缓冲池

如果可能,增加 shared_buffers 的大小。

4) 减少(或移除)索引

如果数据加载到一个新表中,可以在数据加载完成后再创建索引。如果是加载到一个现有表中,避免过多的索引。

每个额外的索引都会显著减慢数据加载的速度。

5) 减少(或移除)外键和触发器

与索引类似,外键约束和触发器也可能会显著减慢数据加载速度。可以考虑在批量加载后再 (重新) 创建它们。

触发器可以通过 ALTER TABLE ... DISABLE TRIGGERS ALL 禁用 — 但如果触发器支持某些一致性检查,需要确保这些检查没有被违反 (例如,数据加载后运行额外的检查)。外键通过隐式触发器实现,ALTER TABLE ... DISABLE TRIGGERS ALL 也会禁用它们 — 在这种情况下加载数据时要特别小心。

6) 避免WAL写入

如果这是一个新表,可以考虑在数据加载期间完全避免 WAL 写入。有两种选择 (都有限制,需要理解如果发生崩溃,数据可能会丢失):

7) 并行化

考虑并行化。这可能会加速过程,但也取决于单线程进程的瓶颈 (例如,如果单线程负载使磁盘 IO 饱和,则并行化将无济于事)。有两种选择:

如果你使用 TimescaleDB,考虑使用 timescaledb-parallel-copy 工具。

最后但同样重要的是:在进行大规模数据加载后,不要忘记运行 ANALYZE。

我见

过多索引,我写了一篇文章进行分析:慢工出细活,久久方为功,另外关于 minimal + copy 的技巧,也值得写一篇,PostgreSQL 14 internals 一书中也有介绍,敬请期待。

讨论与补充

在 GitHub 查看讨论

支持作者

感谢支持 PostgreSQL Howto 的长期维护。

微信赞赏码

读者交流群

二维码若已过期,可通过公众号 PostgreSQL 学徒或邮件联系。

PostgreSQL 学徒读者交流群二维码