2012-01-05 23 views
8

Tôi đang sử dụng Apache Derby để lưu trữ một số lượng lớn các hàng theo thứ tự 10s của Hàng triệu. Mỗi khi tôi bắt đầu chèn hàng loạt, tôi sẽ chèn tối đa 2 Hàng triệu hàng vào bảng. Bảng có UUID làm khóa chính và một đường viền đơn với UUID trong một bảng khác. Việc chèn mất giờ! Tại sao ? Tôi đã tạo INDEX trên tất cả các bảng - nhưng tôi đã loại bỏ điều này vì tôi tin rằng Derby sẽ tự động tạo một INDEX cho mỗi bảng bằng một khóa chính. Tôi đang sử dụng cập nhật hàng loạt với một tuyên bố chuẩn bị như hướng dẫn (trong hình thức rất đơn giản dưới đây)Apache Derby INSERTS là chậm

final PreparedStatement addStatement = connection.prepareStatement(...) 
int entryCount = 0; 
    for (final T entry : entries) { 
    addStatement.addBatch(); 
    entryCount++; 
    if (entryCount % 1000 == 0) { 
    addStatement.executeBatch(); 
    addStatement.clearBatch(); 
    entryCount = 0; 
    } 
addStatement.close(); 

Đây là kết quả

05/01/12 12:42:48 Creating 2051469 HE Peaks in DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 12:44:18 Progress: Written (10%) 205146/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 12:46:51 Progress: Written (20%) 410292/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 12:50:46 Progress: Written (30%) 615438/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 05/01/12 12:56:46 Progress: Written (40%) 820584/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 13:04:29 Progress: Written (50%) 1025730/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 13:13:19 Progress: Written (60%) 1230876/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 13:22:54 Progress: Written (70%) 1436022/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 13:34:53 Progress: Written (80%) 1641168/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 13:47:02 Progress: Written (90%) 1846314/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE 
05/01/12 13:58:09 Completed: Written (100%) 2051469/2051469 entries to DB Table APP.ST_HE_PEAK_TABLE - Time Taken:01:15:21 

Như tôi đã chèn ngày càng có nhiều hàng, quá trình này sẽ chậm hơn và chậm hơn (có thể là do INDEX). Mô hình DB mà tôi có tại thời điểm này phục vụ cho mục đích của tôi tốt và tôi không muốn thay đổi nó. Tôi có làm gì sai không? ... hoặc mong đợi quá nhiều? Có cách nào để cải thiện tốc độ INSERT không?


Sửa

Tôi đã được điều chỉnh DB sử dụng autocommit và những người khác. Tôi thấy rằng khi INSERT hàng triệu bản ghi - nó mất một khoảng thời gian không hợp lý cho ứng dụng của tôi. SELECT trên dữ liệu này tất nhiên là rất nhanh.

+0

Bạn biết mình có thể giữ dữ liệu liên tục trên đĩa với Derby và tải dữ liệu từ xa như ID bản ghi cuối cùng? _ (Xin lỗi vì điều hiển nhiên.) _ –

Trả lời

8

Bạn đã thử tắt chế độ tự động không? Từ http://db.apache.org/derby/docs/dev/tuning/tuningderby.pdf:

Chèn có thể giảm tốc độ chậm trong chế độ tự động vì mỗi cam kết liên quan đến bản cập nhật nhật ký trên đĩa cho mỗi câu lệnh INSERT. Cam kết sẽ không trở lại cho đến khi ghi đĩa vật lý được thực hiện. Để tăng tốc độ mọi thứ:

  • Chạy trong chế độ giả tự động, thực hiện một số lần chèn trong một giao dịch và sau đó phát hành cam kết rõ ràng.
  • Nếu ứng dụng của bạn cho phép tải ban đầu vào bảng, bạn có thể sử dụng thủ tục nhập để chèn dữ liệu vào bảng. Derby sẽ không ghi lại các chèn riêng lẻ khi tải vào một bảng trống bằng cách sử dụng các giao diện này. Xem Tài liệu tham khảo Derby Hướng dẫn sử dụng và Hướng dẫn quản trị và máy chủ Derby để biết thêm thông tin về thủ tục nhập .
+0

Cảm ơn bạn đã trả lời. Tôi đã được điều chỉnh DB bằng cách sử dụng autocommit và những người khác. Tôi thấy rằng khi INSERT hàng triệu bản ghi - nó mất một khoảng thời gian không hợp lý cho ứng dụng của tôi. SELECT trên dữ liệu này tất nhiên là rất nhanh. Tôi đã phải cơ cấu lại DB để viết một bộ sưu tập các đối tượng sử dụng ProtocolBuffers hoạt động rất tốt và cực kỳ nhanh - chỉ có vấn đề là tôi phải tải toàn bộ các đối tượng bất cứ khi nào tôi muốn sử dụng dữ liệu - nhưng điều này là đủ cho tôi . –

+0

@AndyTudor - bạn có thể giải thích: "Tôi đã phải cơ cấu lại DB để viết một bộ sưu tập các đối tượng sử dụng ProtocolBuffers hoạt động rất tốt và cực kỳ nhanh - chỉ có vấn đề là tôi phải tải toàn bộ các đối tượng bất cứ khi nào tôi muốn sử dụng dữ liệu". Tôi đang đối mặt với thử thách tương tự và muốn biết liệu đây có phải là điều tôi có thể làm hay không .. – donlys

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