JDBC中的批量插入 - 单个事务的速度会慢多少?

时间:2013-04-20 00:41:02

标签: java postgresql jdbc

我刚刚发现了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的差异会显着吗?

2 个答案:

答案 0 :(得分:1)

PgJDBC批处理通常不如多值INSERT快,但 更方便。

到目前为止,最有效的选择是通过PgJDBC's support for COPY使用COPY命令。

第二个选项是打开一个事务,每批插入一堆(例如)10行的多值插入,然后是一组单行插入来弥补差异,然后提交。

PgJDBC批处理不应该比打开一个事务,准备一个语句,循环使用准备好的语句发送每一行的数据,然后进行显式提交要快得多。我不认为它当前在批处理中同时有多个语句在飞行中,但我不确定,如果确实如此,那么当网络延迟是一个时,批量会明显加快因素。

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

答案 1 :(得分:0)

批处理通常比其他方式更快。<​​/ p>

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

  1. 自动提交已开启。 DB写入TX日志。批量更快。
  2. 自动提交已开启。 DB不写TX日志。相同的速度,网络问题可能导致批处理更快。
  3. 自动提交已关闭。 DB写入TX日志。在(2)
  4. 中相同
  5. 自动提交已关闭。 DB不写日志。在(2)中相同。
  6. 由于通常查询是在TX中执行的,因为日志记录和网络是一个瓶颈,批处理通常更快。出于同样的原因,ORM框架提供了以批处理模式执行查询的工具。