0

我刚刚发现 JDBC 的 addBatch 操作,如果给定 "INSERT INTO mytable (id, name) VALUES (?, ?)" 将创建如下内容:

BEGIN TRANSACTION
INSERT INTO mytable (id, name) VALUES (1, "a"); 
INSERT INTO mytable (id, name) VALUES (2, "b");
...
END TRANSACTION 

与这样的陈述相比:"INSERT INTO mytable (id, name) VALUES (1, "a"), (2, "b"), .. ",大规模交易会慢多少?I/O 的差异是否重要?

4

2 回答 2

1

PgJDBC 批处理一般不如 multi-valued 快INSERT,但方便。

到目前为止,最有效的选择是COPY通过PgJDBC 对COPY.

第二种选择是打开一个事务,进行批量多值插入(比如说)每个插入 10 行,然后是一组单行插入以弥补差异,然后提交。

PgJDBC 批处理不应该比打开事务、准备语句、使用准备好的语句循环发送每一行的数据、然后执行显式提交快得多。我不认为它目前在批处理中一次有多个语句,但我不确定这一点,如果这样做的话,当网络延迟是一个因素时,这会使批处理显着加快。

我建议对其进行测试并了解其影响的实际想法。

于 2013-04-20T05:19:18.717 回答
0

批处理通常比其他方式更快。

下面是几个案例给你一个想法,假设这是相同的连接:

  1. 自动提交已开启。DB 写入 TX 日志。批处理速度更快。
  2. 自动提交已开启。DB 不写入 TX 日志。同样的速度,网络问题可能会导致批处理速度更快。
  3. 自动提交已关闭。DB 写入 TX 日志。与 (2) 相同
  4. 自动提交已关闭。DB 不写日志。与(2)相同。

由于查询通常在 TX 中执行,带有日志记录并且网络是瓶颈,因此批处理通常更快。出于同样的原因,ORM 框架提供了一种以批处理模式执行查询的工具。

于 2013-04-20T05:04:49.633 回答