我正在尝试使用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();
}
我认为第二种方法更清洁,因为它在每批次之后提交,但第一种方法比第二种方法花费的时间少得多。
有人可以向我解释为什么会这样吗?或者,如果我的方法和理解中有任何错误。
答案 0 :(得分:3)
使用相同预准备语句的不同绑定变量进行批处理:
Range("M2").Formula = Date() & "other formula part"
答案 1 :(得分:3)
有人可以向我解释为什么会这样吗?
这里可以优化许多不同的东西:
您的例子正在优化不同的事情:
正如您所发现的那样,瓶颈最终成为开仓和平仓交易的开销。多次往返也没有帮助。这些比不使用绑定参数更昂贵。
令人高兴的是,在这个例子中,您可以优化所有这三件事。您可以使用绑定参数,一次性将所有命令发送到数据库,然后执行单个提交。请参阅Jean de Lavarene的答案。
请注意行为的变化:如果您在一个批处理中提交,则一个错误将导致批处理中的所有内容回滚。这可能正是您想要的,但如果没有,这些考虑可能优先于性能。
答案 2 :(得分:0)
使用一批。
除非您的提交大小的高水位标记超出服务器的日志限制(在这种情况下,您的事务将在部分时间内回滚),您可能希望所有语句成功完成或所有失败。解开部分数据库更新要困难得多,并且(根据您的情况),如果只有一些更新成功,您可能会将数据保持在不一致状态。
允许DB优化解析一个命令,协调所有活动,仅启动一个事务,并且只进行一次提交。