通过JDBC在Oracle中选择和更新一百万行的性能很差

Sac*_*hin 5 java oracle jdbc oracle11g batch-processing

我有一个超过100万行的用户表(Oracle 11g数据库),其中包含纯文本的所有用户密码,我试图使用SHA512算法(哈希和盐)进行哈希.从下面开始是我的Java类从用户表读取所有记录,哈希并更新回用户表.

  • 我正在为SELECTUPDATE查询使用预准备语句
  • 我已将准备好的语句提取大小设置为1000(setFetchSize(1000))
  • 我已将auto commit属性设置为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();
}
Run Code Online (Sandbox Code Playgroud)

要更新100,000条记录,上述方法需要接近8分钟,我觉得这很高.

使用的数据库: Oracle 11g

Java版本: 1.6

环境: Windows 7

我不确定我是否遗漏了什么.您能建议或推荐任何处理此类散装货物的最佳方法吗?

UPDATE

我再看一下临时表 - 我之前创建的USER,可以看到没有向ID列添加主键约束.我继续为ID列添加PK约束并重新运行我的实用程序.现在只需36秒即可处理100,000行.

为了确保双重确定,我还创建了另一个没有PK约束的临时表USER_TMP2并运行了我的实用程序,通常需要8分钟才能完成100,000

小智 -1

创建用户表的视图,并从该表中获取数据。这将优化您的查询执行时间。这可能对你的情况有帮助。