我有一个超过100万行的用户表(Oracle 11g数据库),其中包含纯文本的所有用户密码,我试图使用SHA512算法(哈希和盐)进行哈希处理。从下面开始是我的Java类从用户表读取所有记录,哈希并更新回用户表。
setFetchSize(1000)
)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列中没有添加主键约束。我继续为ID列添加PK约束并重新运行我的实用程序。现在只需 36秒即可处理 100,000行。
为了确保我还创建了另一个临时表 USER_TMP2 而没有PK约束并运行了我的实用程序, 8分钟照常 100,000
答案 0 :(得分:1)
我再看一下临时表 - 我之前创建的USER,可以看到没有为ID列添加主键约束。我继续为ID列添加PK约束并重新运行我的实用程序。现在只需36秒即可处理100,000行。
为了确保我还创建了另一个没有PK约束的临时表USER_TMP2并运行了我的实用程序,并且通常需要8分钟才能完成100,000次
故事的道德:在调查不良表现时,首先要做的事情要研究所涉及的表的索引 - 通过简单的检查或查看查询的执行计划 - 来确保你没有做很多不必要的表扫描。
答案 1 :(得分:-1)
查看用户表,并从该表中获取数据。这将优化您的查询执行时间。它可能对您的情况有所帮助。