Java JDBC中的批插入-单个事务的速度会慢多少?
我刚刚发现JDBC的addBatch操作,如果给定“INSERT INTO mytable(id,name)VALUES(?),将创建如下内容:Java JDBC中的批插入-单个事务的速度会慢多少?,java,postgresql,jdbc,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)VA
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中的差异会有重大影响吗 批处理通常比其他处理更快
下面是几个案例,假设这是相同的连接,给你一个想法:
由于查询通常在TX中通过日志记录执行,并且网络是一个瓶颈,因此批处理通常更快。出于同样的原因,ORM框架提供了一种以批处理模式执行查询的工具。PgJDBC批处理通常不如多值插入快速,但它更方便 到目前为止,最有效的选择是通过使用
COPY
命令
第二种选择是打开一个事务,进行批量多值插入(比如说)每次插入10行,然后进行一组单行插入以弥补差异,然后进行提交
PgJDBC批处理的速度不应明显快于打开事务、准备语句、使用准备好的语句在数据上循环发送每一行,然后执行显式提交。我不认为它当前在一个批处理中同时有多个语句,但我不确定这一点,如果它有,那么当网络延迟是一个因素时,批处理会显著加快
我建议对其进行测试,并了解其影响。我认为批处理是为了消除网络往返和延迟。显然,发送一批N个操作与执行N个操作,每个操作有一个往返会有很大的不同。