gpt4 book ai didi

java - 通过 JDBC 在 Oracle 中选择和更新一百万行的性能不佳

转载 作者:搜寻专家 更新时间:2023-11-01 00:54:59 25 4
gpt4 key购买 nike

我有一个超过 100 万行的用户表 (Oracle 11g DB),其中所有用户密码都是纯文本形式,我正在尝试使用 SHA512 算法(哈希和盐)对其进行哈希处理。从下面开始是我的 Java 类,用于从用户表中读取所有记录,对其进行哈希处理并更新回用户表。

  • 我正在为 SELECTUPDATE 查询使用准备好的语句
  • 我已将准备好的语句提取大小设置为 1000 (setFetchSize(1000))
  • 我已将自动提交属性设置为 false
  • 使用批处理方式进行批量更新
try {
ps = con.prepareStatement("update user set password=? where ID=?");
psSel = con.prepareStatement("select ID, password from user");
psSel.setFetchSize(1000);
rs = psSel.executeQuery();
String hashPassword = null;
while (rs.next()) {
long id = rs.getLong(1);
String pwd = rs.getString(2);
hashPassword = <<CALL TO PASSWORD HASHING UTIL>>;
ps.setString(1, hashPassword);
ps.setLong(2, id);
ps.addBatch();

//Every 5000 records update and commit
if(++count % batchSize == 0) {
ps.executeBatch();
con.commit();
}

}
ps.executeBatch();
con.commit();
} catch (SQLException e) {
e.printStackTrace();
}

更新 100,000 条记录,上述方法需要将近 8 分钟,我觉得这是相当高的。

使用的数据库: Oracle 11g

Java 版本:1.6

环境:Windows 7

我不确定我是否遗漏了什么。您能否建议或推荐任何处理此类批量负载的最佳方法?

更新

我再次查看了我之前创建的临时表 - USER,发现 ID 列中没有添加Primary Key constraint。我继续为 ID 列添加 PK 约束并重新运行我的实用程序。现在处理100,000 行只需要36 秒

为了确保我还创建了另一个没有 PK 约束的临时表 USER_TMP2 并运行了我的实用程序,它像往常一样花费了 8 分钟 100,000

最佳答案

I took a second look at the temp table - USER I created before and could see there was no Primary Key constraint added to the ID column. I went ahead and added the PK constraint for ID column and re ran my utility. Now it just took 36 seconds to process 100,000 rows.

To be double sure I also created another temp table USER_TMP2 without PK constraint and ran my utility and it took 8 mins as usual for 100,000

故事的寓意:调查性能不佳时,第一件事是调查所涉及表的索引——通过简单检查或查看查询的执行计划——以确保你没有做很多不必要的表扫描。

关于java - 通过 JDBC 在 Oracle 中选择和更新一百万行的性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39045041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com