2016-08-19 21 views
5

Tôi có bảng người dùng (Oracle 11g DB) với hơn 1 triệu hàng có tất cả mật khẩu người dùng trong văn bản thuần mà tôi đang cố gắng băm bằng thuật toán SHA512 (băm và muối). Để bắt đầu với dưới đây là lớp Java của tôi để đọc tất cả các bản ghi từ bảng người dùng, băm nó và cập nhật trở lại bảng người dùng.Hiệu năng kém để CHỌN và CẬP NHẬT một triệu hàng trong Oracle qua JDBC

  • Tôi đang sử dụng tuyên bố chuẩn bị cho cả CHỌNCẬP NHẬT truy vấn
  • tôi đã thiết lập các tuyên bố chuẩn bị lấy kích thước 1000 (setFetchSize(1000))
  • tôi đã thiết lập tự động cam kết tài sản để sai
  • Sử dụng phương pháp hàng loạt để làm cập nhật hàng loạt
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(); 
} 

Để cập nhật 100.000 bản ghi, phương pháp trên mất gần 8 phút mà tôi cảm thấy khá cao.

Cơ sở dữ liệu được sử dụng: Oracle 11g

Java Version: 1,6

Môi trường: Windows 7

Tôi không chắc chắn nếu tôi thiếu cái gì. Bạn có thể tư vấn hoặc giới thiệu cách tốt nhất để xử lý tải hàng loạt không?

CẬP NHẬT

Tôi đã xem xét thứ hai tại bảng temp - USER Tôi tạo ra trước và có thể thấy là không có Tiểu chế chính thêm vào cột ID. Tôi đã đi trước và thêm ràng buộc PK cho cột ID và chạy lại tiện ích của tôi. Bây giờ nó chỉ mất 36 giây để xử lý 100.000 hàng.

Để có đôi chắc chắn tôi cũng đã tạo ra một bảng temp USER_TMP2 mà không hạn chế PK và chạy tiện ích của tôi và nó mất 8 phút như thường lệ cho 100.000

+3

8 phút đến ** băm ** và cập nhật trong DB 1 triệu bản ghi không có vẻ cao –

+7

Bạn có thể sao chép hàm băm của mình ở phía cơ sở dữ liệu không? Bạn có thể làm một bản cập nhật duy nhất nếu có, mà không phải di chuyển tất cả dữ liệu trên mạng đến và từ Java. Nó không phải là rõ ràng, nơi nút cổ chai là ở đây mặc dù. –

+1

Tại sao không sử dụng 'HASH_SH512' trong' DBMS_CRYPTO'? – ppeterka

Trả lời

-1

Hãy nhìn bảng người dùng, và lấy dữ liệu từ bảng đó. Điều này sẽ tối ưu hóa thời gian thực hiện truy vấn của bạn. Nó có thể hữu ích trong trường hợp của bạn.

+0

Không có gì về việc tạo chế độ xem sẽ tối ưu hóa việc thực thi truy vấn –

1

Tôi đã xem lại bảng tạm thời - USER tôi đã tạo trước đó và có thể thấy không có ràng buộc khóa chính được thêm vào cột ID. Tôi đã đi trước và thêm ràng buộc PK cho cột ID và chạy lại tiện ích của tôi. Bây giờ nó chỉ mất 36 giây để xử lý 100.000 hàng.

Để có đôi chắc chắn tôi cũng tạo ra một USER_TMP2 bảng temp mà không hạn chế PK và chạy tiện ích của tôi và nó mất 8 phút như bình thường cho 100.000

đạo đức của câu chuyện: Khi điều tra hoạt động kém hiệu điều đầu tiên để làm là điều tra việc lập chỉ mục các bảng có liên quan – hoặc bằng cách kiểm tra đơn giản hoặc bằng cách xem các kế hoạch thực hiện của các truy vấn – để đảm bảo rằng bạn không thực hiện nhiều lần quét bảng không cần thiết.

Các vấn đề liên quan