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

时间:2016-08-19 17:49:30

标签: java oracle jdbc oracle11g batch-processing

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

  • 我正在为 SELECT 更新查询
  • 使用预备声明
  • 我已将准备好的语句提取大小设置为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列中没有添加主键约束。我继续为ID列添加PK约束并重新运行我的实用程序。现在只需 36秒即可处理 100,000行

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

2 个答案:

答案 0 :(得分:1)

  

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

     

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

故事的道德:在调查不良表现时,首先要做的事情要研究所涉及的表的索引 - 通过简单的检查或查看查询的执行计划 - 来确保你没有做很多不必要的表扫描。

答案 1 :(得分:-1)

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