【发布时间】:2014-01-31 01:13:20
【问题描述】:
我正在使用以下模式在 SQLServer 2008 R2 上执行 jdbc 批处理。批处理执行是一个表上的简单 MERGE 语句,根据 MERGE 连接子句具有适当的索引。
batchSize = 50;
for(.....){
...
...
...
//add to batch
ps.addBatch();
if (count >= batchSize) {
result = ps.executeBatch();
count = 0;
}
}
if (count > 0) {
result = ps.executeBatch();
count = 0;
}
我有非常大的数据泵入 for 循环。我观察到的是最初执行大小为 50 的批次大约需要。 150 毫秒,然后当达到 40 万条记录时,它会以指数方式增加到 2.5 分钟!
是否需要一些特定于 sqlserver 的调整?
【问题讨论】:
-
您是否尝试过改变批量大小?
-
是的,还是一样的行为...
-
在 2.5 分钟内添加 50 万条记录听起来还不错。您在其他地方看到过更好的表现吗?
-
我很难找到的是,当连接自动提交时,为什么每个批处理执行时间都是指数级的!
-
一个有趣的任务可能是插入一个 Thread.timeout 并暂停一个计时器,以查看数据库是否只需要额外的时间来索引所有这些记录。或者,关闭自动提交并查看手动提交是否会更改任何内容,您必须使用事务。
标签: java sql-server sql-server-2008 jdbc