我们正在构建一个由 Postgres 支持的 CQRS 系统。作为其中的一部分,我们生成“readmodels”,它们是事件源数据的预先计算的投影。我们经常需要创建新表、查询事件源数据、计算投影并将数千行(主要包含 jsonb 数据)插入新表。
这些插入需要在一个事务内完成,该事务还包括对其他表的读取和写入。
我们的初始代码使用标准INSERT ... ON CONFLICT UPDATE
命令并实现了每秒约 100 行 ()。但是,当我将其更改为使用COPY ... FROM STDIN (FORMAT BINARY)
提高约 100 倍的吞吐量时。我知道我不能以与第二种方法相同的方式进行“更新插入”,但只是计划在 COPY 插入之前删除记录(在交易中)。
我正在考虑使用我们应用程序的 COPY 流程。然而,我收到了批评“我怀疑它会起作用。COPY 是为批量导入而设计的。你会遇到并发问题”。
我的直觉是,有了 Postgres 的 MVCC 和事务性 DDL,它可能足够强大,可以毫不费力地处理这样的事情。不过,我心中充满了恐惧、不确定和怀疑!
我的问题:
1/ 我可以像其他语句一样在正常交易中使用 COPY 吗?
2 / 当数据库仍然存在且正常生产插入和选择仍在针对其他表运行时,是否可以发生大量 COPY 加载?
3/ 多个连接能否并发执行COPY操作?(针对不同的表)
4/ 我是否疯狂地想像对待任何其他 PG 命令一样对待它?它是设计用于实时、生产数据库,还是更像是一种管理工具。
我们使用 NPGSQL 作为 Postgres 的客户端库。
谢谢!
参考:
阅读 PG 文档中的注释部分
有人在 Production 中使用 10m 行文件实现了相同的