2016-08-19 70 views
5

我有一個擁有超過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

回答

-1

讓用戶表的視圖,並獲取該表中的數據。這將優化您的查詢執行時間。這可能對您的情況有所幫助。

+0

創建視圖的任何內容都不會優化查詢執行 –

1

我再次查看了我之前創建的臨時表 - 用戶,可以看到沒有主鍵約束添加到ID列。我繼續爲ID列添加PK約束,並重新運行我的實用程序。現在只需要36秒來處理100,000行。

雙待確定我還創造了另一個臨時表USER_TMP2沒有PK限制,跑到我的效用,並花了8分鐘照常100,000

這個故事告訴我們:在調查表現不佳第一件事要做的是通過簡單的檢查或通過查看–查詢的執行計劃來調查涉及–的表的索引,以確保您沒有執行大量不必要的表掃描。

相關問題