通过JDBC在Oracle中选择和更新一百万行的性能差
我有一个拥有超过100万行的用户表(Oracle 11g数据库),其中包含纯文本中的所有用户密码,我尝试使用SHA512算法(散列和盐)。从下面开始我的Java类读取用户表中的所有记录,将其散列并更新回用户表。通过JDBC在Oracle中选择和更新一百万行的性能差
- 我使用准备好的声明中两个选择和UPDATE查询
- 我已准备好的语句获取大小为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的
我不知道如果我失去了一些东西。你能否建议或推荐任何最好的方式来处理这种散装货物?
UPDATE
我花了二看临时表 - USER我之前创建的,可以看到没有PRIMARY KEY约束加入ID列。我继续为ID列添加PK约束,并重新运行我的实用程序。现在只需要36秒来处理100,000行。
双待确定我还创造了另一个临时表USER_TMP2没有PK限制,跑到我的效用,并花了8分钟像往常一样
让用户表的视图,并获取该表中的数据。这将优化您的查询执行时间。这可能对您的情况有所帮助。
创建视图的任何内容都不会优化查询执行 –
我再次查看了我之前创建的临时表 - 用户,可以看到没有主键约束添加到ID列。我继续为ID列添加PK约束,并重新运行我的实用程序。现在只需要36秒来处理100,000行。
双待确定我还创造了另一个临时表USER_TMP2没有PK限制,跑到我的效用,并花了8分钟照常100,000
这个故事告诉我们:在调查表现不佳第一件事要做的是通过简单的检查或通过查看–查询的执行计划来调查涉及–的表的索引,以确保您没有执行大量不必要的表扫描。
8分钟到**哈希**并在数据库中更新100万条记录看起来不高 – 2016-08-19 17:51:14
您是否能够在数据库端复制哈希函数?如果可以的话,你可以做一次更新,而不必通过网络将所有数据移入和移出Java。目前尚不清楚这里的瓶颈在哪里。 –
为什么不在'DBMS_CRYPTO'中使用'HASH_SH512'? – ppeterka