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 批量执行性能的主要内容,如果未能解决你的问题,请参考以下文章

hibernate的update及JDBC数据库批量操作

hibernate的update及JDBC数据库批量操作

JDBC批量处理

JDBC 复习4 批量执行SQL

java 如何批量插入数据

如何在spring boot jdbc中从具有批量大小的多个表中执行批量删除