发布于2021-07-21 07:54 阅读(1150) 评论(0) 点赞(8) 收藏(4)
我正在尝试在具有数百万条记录的表上使用 rownum 分批运行更新语句。
第一种方法是将所有查询一起批处理,然后运行executeBatch()
如下方法,
for (i = num; i < limit; i += num) {
String query = "update Table set someColumn ='T' where rownum<=" + i;
preparedStatement = dbConnection.prepareStatement(query);
preparedStatement.addBatch();
}
preparedStatement.executeBatch();
dbConnection.commit();
第二种方法是运行一个批量更新语句并在每批之后提交,如下所示,
String query = "update Table set someColumn ='T' where rownum<=?";
preparedStatement = dbConnection.prepareStatement(query);
int count = 1;
while (count > 0) {
preparedStatement.setInt(1, num);
count = preparedStatement.executeUpdate();
dbConnection.commit();
}
我认为第二种方法更干净,因为它在每批之后提交,但是第一种方法比第二种方法花费的时间少得多。
有人可以向我解释为什么会这样吗?或者如果我的方法和理解有任何错误。
有人可以向我解释为什么会这样吗?
有许多不同的东西可以在这里优化:
你的例子正在优化不同的东西:
正如您所发现的,瓶颈是打开和关闭事务的开销。多次往返也无济于事。这些比不使用绑定参数更昂贵。
令人高兴的是,在此示例中,您可以优化所有三件事。您可以使用绑定参数,一次性将所有命令发送到数据库,然后执行一次提交。请参阅 Jean de Lavarene 的回答。
但是请注意行为的变化:如果您在单个批次中提交,一个错误将导致批次中的所有内容回滚。这可能正是您想要的,但如果不是,此类考虑可能会优先于性能。
作者:黑洞官方问答小能手
链接:http://www.javaheidong.com/blog/article/247838/4093bdd03c21f6368892/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!