【发布时间】:2013-01-25 20:41:24
【问题描述】:
该项目需要将二进制数据存储到 PostgreSQL(项目要求)数据库中。为此,我们制作了一个包含以下列的表格:
id : integer, primary key, generated by client
data : bytea, for storing client binary data
客户端是一个 C++ 程序,在 Linux 上运行。 必须插入行(用一大块二进制数据初始化),然后更新(将额外的二进制数据连接到数据字段)。 简单的测试表明,这会产生更好的性能。
根据您的输入,我们将让客户端使用并发线程来插入/更新数据(具有不同的数据库连接),或者只有一个数据库连接的单线程。
我们在 PostgreSQL 方面没有太多经验,所以您能否帮助我们提供一些关于可能存在瓶颈的指针,以及使用多线程插入数据是否比使用单线程更好。
谢谢你:)
编辑 1:
更多详细信息:
- 只有一个客户端访问数据库,只使用一个 Linux 进程
- 数据库和客户端在同一个高性能服务器上,但这一定没关系,无论机器如何,客户端都必须快速,无需额外的客户端配置
- 我们将每 10 秒获取新的数据流,流将每 0.5 秒提供新的 16000 字节(CBR,但我们可以使用缓冲,并且最多只能每 4 秒插入一次)
- 流将持续 10 秒到 5 分钟之间的任何时间
【问题讨论】:
-
完成一行后,bytea 字段的平均大小和最大大小是多少?
-
@DanielVérité: max: 300s * 32000 b/s = 9.6mb, min: 10s * 32000 b/s = 320kb, 平均: 大约 3mb
标签: database postgresql concurrency insert locking