2010-08-28 30 views
6

Tôi đang viết một phần mềm yêu cầu tôi chuẩn bị các câu lệnh và thiết lập các giá trị, thực hiện truy vấn và nhận kết quả trong vòng lặp. Vòng lặp này có thể có hơn 7.000 chu kỳ. Nếu tôi sử dụng các câu lệnh đơn giản hơn là các câu lệnh chuẩn bị, thì tốc độ thực thi sẽ thay đổi rất nhiều?Báo cáo chuẩn bị có làm chậm chương trình một cách dễ thấy không?

Đây là mã giả

  1. Chuẩn bị Báo cáo
  2. Nhận một danh sách từ một nơi nào
  3. Duyệt qua danh sách
  4. có được các báo cáo được chuẩn bị và thực hiện một số truy vấn db và đóng các nguồn tài nguyên mới như tập hợp kết quả.
  5. điền bản đồ bằng kết quả và giá trị từ danh sách ban đầu

Cảm ơn.

+4

Báo cáo chuẩn bị thường * nhanh hơn * so với truy vấn thông thường nếu bạn liên tục chạy cùng một truy vấn. – Amber

+3

Hiệu suất là tốt đẹp nhưng chiến thắng thực sự với PreparedStatements là ràng buộc tham số có thể thực hiện thông qua API hơn là nối chuỗi. Điều này đặc biệt hữu ích cho các loại ngày. Cũng ngăn chặn các cuộc tấn công SQL injection. –

+0

@amber, có một chi phí chuẩn bị có thể mất một thời gian để mua lại trước khi báo cáo được chuẩn bị nhanh hơn trong thời gian tường. –

Trả lời

8

Báo cáo được chuẩn bị là FASTER sau đó báo cáo không được chuẩn bị nếu bạn liên tục sử dụng cùng một câu lệnh với nhiều bộ dữ liệu. Tôi không biết về một tình huống mà điều này không đúng.

Khi bạn đã chuẩn bị một tuyên bố, nó được gửi đến máy chủ DB, sau đó chỉ phải chấp nhận dữ liệu mỗi khi bạn gọi nó - nó không phải xử lý lại câu lệnh mỗi lần bạn liên kết dữ liệu mới.

Vì vậy, câu trả lời đơn giản là:

Không.

+2

Trên thực tế, nếu bạn thực hiện một tuyên bố chỉ một hoặc hai lần thời gian thiết lập của một tuyên bố chuẩn bị có thể lớn hơn đạt được trong quá trình thực hiện :) – extraneon

+0

Tôi có nghĩa là trong tình hình của mình nói chung. Kịch bản được đề xuất của ông là "lặp qua danh sách". Tôi đã không rõ ràng trong phản ứng của tôi. Đã chỉnh sửa bài đăng gốc của tôi để rõ ràng. – Erik

4

Câu lệnh đã chuẩn bị nhanh hơn cho các tác vụ lặp đi lặp lại.

http://download.oracle.com/javase/tutorial/jdbc/basics/prepared.html:

Nếu bạn muốn thực hiện một đối tượng Statement nhiều lần, nó thường làm giảm thời gian thực hiện để sử dụng một đối tượng PreparedStatement thay thế.

4

Chỉ một số thứ xuất hiện: đảm bảo bạn không tạo các câu lệnh chuẩn bị trong vòng lặp của mình. Có một số chi phí liên quan, nhưng trả lại cho chính nó sau khi truy vấn thứ 3 hay như vậy. Trên thực tế với danh sách tham số lớn, nó thậm chí có thể nhanh hơn cho một truy vấn đơn lẻ.

Điều gì đó làm tăng tốc độ đáng kể mọi thứ đang chạy tất cả các truy vấn của bạn trong một giao dịch đơn lẻ (hoặc một số lượng lớn). Nếu đó là các tập dữ liệu lớn, bạn có thể đến 1000 truy vấn cho mỗi giao dịch hoặc một cái gì đó tương tự. (Tất nhiên ngữ nghĩa của mô hình miền của bạn phải cho phép điều này, nhưng theo kinh nghiệm của tôi hầu như luôn luôn như vậy).

Số lượng truy vấn bạn có thể gộp trong một giao dịch duy nhất là phần nào phụ thuộc vào cơ sở dữ liệu do đó một số thử nghiệm và đọc có thể được yêu cầu.

1

Bạn cũng có thể xem xét lấy nhiều giá trị mỗi tuyên bố:

SELECT id, value FROM table WHERE id IN (?, ?, ?, ?, ?, ?)

Đây sẽ là nhanh hơn so với truy vấn cá nhân.

+0

Đây chính xác là những gì tôi đang làm. – mwangi

+0

Quan điểm của tôi là bạn có thể lặp qua danh sách trong các bước của 10 hoặc nhiều mục cho mỗi cuộc gọi cơ sở dữ liệu. –

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