2009-07-17 17 views
6

Tùy thuộc vào câu hỏi này, hãy hỏi tất cả: Phương thức executeBatch hiệu quả như thế nào? Có một điểm chuẩn hiệu suất, mà nói .. 'nếu bạn có 1000 hồ sơ được chèn vào, sử dụng một executeBatch thay vì executeUpdate giúp bạn tiết kiệm x số lượng chu kỳ cơ sở dữ liệu?'Làm thế nào hiệu quả là executeBatch trên một tuyên bố chuẩn bị?

Hoặc đây chỉ là một quy ước? Đây là những gì tôi đang làm việc: DB2 V 8.1 được lưu trữ trên Z/OS, một ứng dụng web có thể chèn 80.000 bản ghi tại một lần trong trường hợp kịch bản xấu nhất của nó.

+2

Thay vì mọi người đưa cho bạn số len, tại sao bạn không thử nó cho chính mình và đo lường nó? Chỉ có bạn mới biết được bạn sẽ nhận được bao nhiêu lợi ích từ việc thiết lập của mình. – skaffman

+1

@skaffman Tôi không muốn làm những gì được gọi là tối ưu hóa sớm. Tuy nhiên, tôi muốn hiểu nó nhanh hơn bao nhiêu. – Jay

+0

Tôi hiểu điều đó, nhưng bạn không thể đưa ra lựa chọn sáng suốt mà không có chút điểm chuẩn. – skaffman

Trả lời

8

Không chắc chắn bạn đang sử dụng cơ sở dữ liệu nào. Khi tôi chạy một thử nghiệm về vấn đề này sử dụng DB2 đây là những gì tôi nhìn thấy:

Để ghi vào cơ sở dữ liệu:

1 chèn nó mất 2500 micro giây.

10 chèn mất 6000 micro giây. (600 micro giây mỗi ghi)

10000 chèn mất khoảng 1 triệu micro giây. (100 micro giây mỗi lần viết)

Hiệu suất tối đa ở đó. Tất cả điều này có nghĩa là có một chi phí rất lớn trong việc gửi tin nhắn, và sử dụng một phương pháp lô giảm thiểu điều này. Tất nhiên, gửi chèn/cập nhật theo lô lớn sẽ dẫn đến nguy cơ mất chúng nếu ứng dụng gặp sự cố.

Cũng lưu ý: Các số chính xác sẽ khác nhau tùy thuộc vào DB và cài đặt của bạn. Vì vậy, bạn sẽ phải tìm "điểm ngọt ngào" của riêng bạn. Nhưng điều này mang lại cho bạn một ý tưởng.

+0

@windfinder bạn đã sử dụng executeBatch cho tất cả những điều trên? Và, bạn nói 'các lô hàng lớn có nguy cơ bị mất trong các sự cố ứng dụng' - nếu tôi đang sử dụng quản lý giao dịch - tôi có nên làm tốt trong trường hợp này không? – Jay

+0

Có, tôi đã sử dụng executeBatch. Quản lý giao dịch sẽ không loại bỏ hoàn toàn rủi ro này, nhưng nó có thể làm giảm rủi ro. – Alex

+0

Theo cách đơn giản nhất, nếu tôi đặt autocommit thành false và chỉ cam kết khi executeBatch trả về, Tôi có nguy cơ như thế nào? – Jay

1

Tôi không chắc chắn những gì bạn đang yêu cầu, nhưng để chèn hàng nghìn hàng, một tuyên bố theo đợt là cực kỳ nhanh chóng. Tuy nhiên, tôi không thể cho bạn số.

+0

@skaffman đó là câu hỏi của tôi - nhanh hơn bao nhiêu? Bạn có thể cho tôi một xấp xỉ? – Jay

+0

Tôi ước tính một nơi nào đó giữa 10 và 20 lần, nó sẽ phụ thuộc vào một mức độ lớn trên cơ sở dữ liệu chính nó. Một tuyên bố không theo lô liên quan đến lưu lượng mạng nhiều hơn, do đó, một máy chủ loại bỏ sẽ có lợi nhiều hơn từ việc tạo nhóm so với một địa phương, ví dụ. – skaffman

+1

Hơn 10-20x kinh nghiệm của tôi (đối với trường hợp sử dụng cụ thể của tôi). –

1

Theo kinh nghiệm của tôi, tốc độ này nhanh hơn đáng kể - ngay cả khi bạn đang chèn/cập nhật chỉ một vài bản ghi cùng một lúc. Nếu bạn đang làm nhiều hơn một bản cập nhật, tôi sẽ hầu như luôn luôn khuyên bạn nên sắp xếp chúng nếu nó có ý nghĩa.

Điều đó nói rằng, bạn phải thực hiện một số thử nghiệm thực tế để tìm ra cải thiện hiệu suất cho tình huống cụ thể của bạn.

0

JDBC đặc điểm kỹ thuật Chương 14 nói rằng việc gửi nhiều câu lệnh SQL, thay vì cá nhân, có thể cải thiện hiệu suất

0

Trong batchExecute() cập nhật báo cáo được dành thời gian nhiều hơn sau đó chèn tuyên bố Tôi Tring với 5001 chèn và cập nhật tuyên bố khẩu phần của hiệu suất là 15:84

+0

Và câu trả lời ở đâu? – Rizier123

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