【问题标题】:SQLServer jdbc batch execute performanceSQLServer jdbc 批量执行性能
【发布时间】: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


【解决方案1】:

我在 @30 分钟 时间内完成了 400k 的插入数据量!!!我必须做到以下几点:

  • 将 MERGE 更改为 DELETE/INSERT(如果保持 MERGE,则需要 1.5 小时)
  • 将批量大小增加到 1k
  • 每批执行后提交
  • 批量执行后调用 ps.clearBatch()

就是这样……:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    相关资源
    最近更新 更多