SQLServer jdbc 批量执行性能
Posted
技术标签:
【中文标题】SQLServer jdbc 批量执行性能【英文标题】:SQLServer jdbc batch execute performance 【发布时间】: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 并暂停一个计时器,以查看数据库是否只需要额外的时间来索引所有这些记录。或者,关闭自动提交并查看手动提交是否会更改任何内容,您必须使用事务。 【参考方案1】:我在 @30 分钟 时间内完成了 400k 的插入数据量!!!我必须做到以下几点:
将 MERGE 更改为 DELETE/INSERT(如果保持 MERGE,则需要 1.5 小时) 将批量大小增加到 1k 每批执行后提交 批量执行后调用 ps.clearBatch()就是这样……:)
【讨论】:
以上是关于SQLServer jdbc 批量执行性能的主要内容,如果未能解决你的问题,请参考以下文章