我刚刚发现了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的差异会显着吗?
答案 0 :(得分:1)
PgJDBC批处理通常不如多值INSERT
快,但 更方便。
到目前为止,最有效的选择是通过PgJDBC's support for COPY
使用COPY
命令。
第二个选项是打开一个事务,每批插入一堆(例如)10行的多值插入,然后是一组单行插入来弥补差异,然后提交。
PgJDBC批处理不应该比打开一个事务,准备一个语句,循环使用准备好的语句发送每一行的数据,然后进行显式提交要快得多。我不认为它当前在批处理中同时有多个语句在飞行中,但我不确定,如果确实如此,那么当网络延迟是一个时,批量会明显加快因素。
我建议对其进行测试,并对影响进行实际了解。
答案 1 :(得分:0)
批处理通常比其他方式更快。</ p>
以下几个案例给你一个想法,假设这是相同的连接:
由于通常查询是在TX中执行的,因为日志记录和网络是一个瓶颈,批处理通常更快。出于同样的原因,ORM框架提供了以批处理模式执行查询的工具。