如何减少使用复制命令 COPY csv INTO db 将大量行插入 postgres 数据库表(1 亿行)所需的时间

问题描述 投票:0回答:1

我需要按照 24 小时的频率将大约 1 亿行平面数据插入到 Postgres 数据库中。 IE。每 24 小时,我有一个摄取器将 CSV 文件中的数据插入数据库中。

我事先不知道数据中的哪些行在每次加载时都会发生变化。 该数据库中的数据在 API 端点中显示/发布,即使在重新加载数据期间,该端点也不应该有停机时间。

实施: 我当前的方法执行以下操作

我创建了2个索引; 1 个基于一个 int 和一个 varchar 列,另一个基于 2 个 varchar 列;需要这些系数来改善 API 端点的“第一个字节的时间”。

然后

--> 开始交易

--> 删除表中的所有行

--> 使用 Postgres CSV COPY 命令插入全部 1 亿行

--> 提交交易。

我在事务中进行操作是因为;无论数据如何重新加载,API 都应该可用。

这种方法的问题在于;第一次加载(空数据库、空索引)相对较快(大约需要 2 小时),但后续时间平均需要 36 小时。

任何人都可以建议瓶颈可能是什么以及解决此问题的另一种方法吗?

我怀疑索引妨碍了后续插入。

postgresql sql-insert
1个回答
0
投票

如果你想清空桌子,你绝对应该

TRUNCATE
,而不是
DELETE
DELETE
只是将行标记为无效。

要进一步大幅提高速度,您必须设置

wal_level = minimal
。那么这样的事务就可以避免写WAL。然而,这可能不可行:它需要重新启动,并且会破坏复制和存档恢复 -

© www.soinside.com 2019 - 2024. All rights reserved.