许多小插入 - 更好地批量处理或使用准备好的语句?

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

我正在运行一个生成大约数百万个小数据的软件,需要尽快将它们放入数据库。

此时我正在使用预处理语句并优化了DB(Postgres 9.6)的小插入,并获得了相当不错的性能。但我想知道如果不是准备好的语句我会批量处理数据是否会加速事情,所以我不会单独插入每一行。

我对这个问题进行了一些研究,但没有找到确凿的答案。

我的数据相当小(每行5-10个值)和纯数字(即没有字符串,但是整数,浮点数和布尔值的混合)。我的表使用连续出版物作为主键但没有其他索引。我正在插入由外键链接的多个表。我此时有五份准备好的陈述,每张一张。每个语句都插入一行,因为我无法预先告诉我将获得多少行。

我的陈述是微不足道的 - 没有数学,条件或任何东西,基本上它们都是这样的:

conn.prepare("INSERT INTO event 
(sc_id, r_id, th_id, tc, rs, is_te, is_le, total) 
VALUES ($1, $2, $3, $4, $5, $6, $7, $8) 
RETURNING id")

我在快速存储上使用Postgresql 9.6,我已经进行了基准测试,发现它不是瓶颈。我的软件是用Rust编写的,可以生成比DB可以存储的数据快两个数量级的数据。我已经通过优化Postgres配置将性能提高了4倍,我认为这是我从中得到的大部分内容。

我也在并行线程中运行,每个线程都插入彼此独立的数据集。

数据库服务器与数据生成器位于同一物理机器上,我通过套接字而不是TCP连接。

sql postgresql prepared-statement sql-insert bulkinsert
1个回答
0
投票

您可以通过多行插入获得一些东西:

INSERT INTO xyz (col1, col2, ...) VALUES
   (...),
   (...),
   ...

这里的好处是您减少了客户端 - 服务器往返次数。

但最快的是使用COPY声明。这样,您可以从数据库计算机上的文件或通过客户端连接加载数据。

如果所有这些都不会使I / O子系统饱和,则并行地在多个数据库会话中插入数据。

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