通过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分钟像往常一样

+3

8分钟到**哈希**并在数据库中更新100万条记录看起来不高 – 2016-08-19 17:51:14

+7

您是否能够在数据库端复制哈希函数?如果可以的话,你可以做一次更新,而不必通过网络将所有数据移入和移出Java。目前尚不清楚这里的瓶颈在哪里。 –

+1

为什么不在'DBMS_CRYPTO'中使用'HASH_SH512'? – ppeterka

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

+0

创建视图的任何内容都不会优化查询执行 –

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

双待确定我还创造了另一个临时表USER_TMP2没有PK限制,跑到我的效用,并花了8分钟照常100,000

这个故事告诉我们:在调查表现不佳第一件事要做的是通过简单的检查或通过查看–查询的执行计划来调查涉及–的表的索引,以确保您没有执行大量不必要的表扫描。