我正在尝试使用 jdbc 提高 UPDATE 的速度。有 300000 行,我想将每行的 X 列更改为 5。但我需要根据它们的主键对它们进行排序。因为有 400000 行,我想从顶部更改 300000 行。
这是我到目前为止所做的:
首先,我尝试在使用准备好的语句创建每个查询时发送它
long time = System.currentTimeMillis();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date (time)));
for(int i=number-1; i>=0; i--){
try{
pStmt.setInt(1, (int) hashMap.get(i));
time = System.currentTimeMillis();
result = pStmt.executeUpdate();
time = System.currentTimeMillis() - time;
totalTime += time;
}catch(Exception e){}
}
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date (System.currentTimeMillis())));
time = System.currentTimeMillis() - time;
但是花了很多时间。大约 900 秒。
然后我尝试使用 addBatch() 将它们添加到批处理中
java.sql.PreparedStatement pStmt2 = conn.prepareStatement(query);
for(int i=0; i<number; i++){
pStmt2.setInt(1, (int) hashMap.get(i));
pStmt2.addBatch();
}
long time = System.currentTimeMillis();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date (time)));
pStmt2.executeBatch();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date (System.currentTimeMillis())));
time = System.currentTimeMillis() - time;
它更好,但没有那么好。只有50秒。区别。
我试图执行块。这意味着:有 300000 行,每 30000 行我将查询添加到批处理中,然后执行它们。我这样做了 10 次。
它好多了,但还是太慢了。大约 800 秒
然后我想在一行中用小行(例如 10000)执行此过程:
通过键 DESC 限制 10000 更新 table1 设置结果 = 3 顺序。
这需要前 10000 行,并更改它们的每个结果单元格。这花了大约 24 秒。当我尝试 10000 行时,这一次与其他测试非常接近。
然后我尝试使用游标来完成这个过程。更新 10000 行只用了 4 秒。
结果很有趣。
但我想使用 jdbc 更新它们。还有其他方法吗?为什么光标速度太快?