我需要按照 24 小时的频率将大约 1 亿行平面数据插入到 Postgres 数据库中。 IE。每 24 小时,我有一个摄取器将 CSV 文件中的数据插入数据库中。
我事先不知道数据中的哪些行在每次加载时都会发生变化。 该数据库中的数据在 API 端点中显示/发布,即使在重新加载数据期间,该端点也不应该有停机时间。
实施: 我当前的方法执行以下操作
我创建了2个索引; 1 个基于一个 int 和一个 varchar 列,另一个基于 2 个 varchar 列;需要这些系数来改善 API 端点的“第一个字节的时间”。
然后
--> 开始交易
--> 删除表中的所有行
--> 使用 Postgres CSV COPY 命令插入全部 1 亿行
--> 提交交易。
我在事务中进行操作是因为;无论数据如何重新加载,API 都应该可用。
这种方法的问题在于;第一次加载(空数据库、空索引)相对较快(大约需要 2 小时),但后续时间平均需要 36 小时。
任何人都可以建议瓶颈可能是什么以及解决此问题的另一种方法吗?
我怀疑索引妨碍了后续插入。
如果你想清空桌子,你绝对应该
TRUNCATE
,而不是DELETE
。 DELETE
只是将行标记为无效。
要进一步大幅提高速度,您必须设置
wal_level = minimal
。那么这样的事务就可以避免写WAL。然而,这可能不可行:它需要重新启动,并且会破坏复制和存档恢复 -