2012-01-22 40 views
5

Tôi hiểu sự khác biệt chính giữa việc sử dụng lệnh Statement và PreparedStatement (PreparedStatements cho phép truyền tham số). Nhưng tôi đã đọc về một sự khác biệt tinh tế giữa hai hàm này - cụ thể là các PreparedStatements có thể nhanh hơn các câu lệnh chung, vì SQL PreparedStatement được biên dịch trước.Tuyên bố so với tuyên bố đã chuẩn bị về mặt biên dịch

Chính xác điều gì sẽ được biên dịch trước có nghĩa là gì và tại sao nó tạo sự khác biệt?

+0

Tốt chi tiết về Pre-biên soạn: [http://stackoverflow.com/questions/5497297/what-does-pre-compiling-a-jdbc-preparedstatement-do][1] [1]: http: // stackoverflow.com/questions/5497297/what-does-pre-compiling-a-jdbc-preparedstatement-do – Awan

Trả lời

8

Một tuyên bố chuẩn bị thực hiện việc kiểm tra sau đây:

  • Tạo sự chắc chắn rằng các bảng và các cột tồn tại
  • Tạo sự chắc chắn rằng các loại tham số phù hợp với cột của họ
  • phân tích các SQL để đảm bảo rằng các cú pháp là chính xác
  • Biên dịch và lưu trữ SQL đã biên dịch để có thể thực thi lại mà không lặp lại các bước này
+2

Kiểm tra sự tồn tại của các bảng và cột, xác minh cú pháp, xác thực truy cập, chuẩn bị kế hoạch thực hiện: máy chủ db thực hiện điều này cho mọi câu lệnh, đã chuẩn bị hay không. Các máy chủ như Oracle cũng có các câu lệnh cache (được chuẩn bị hay không) dựa trên một băm của chuỗi câu lệnh nhận được. Một khi công việc này được thực hiện, và máy chủ db đã "chuẩn bị" một vùng nhớ sẵn sàng để đi, thì trình điều khiển jdbc có thể ràng buộc các tham số và sử dụng đối tượng máy chủ này. Sau đó, kết nối lại các tham số mới và tái sử dụng lại mà không cần phải chuẩn bị lại câu lệnh. Nếu người lái xe thực hiện nó theo cách đó. – Glenn

4

Phần quan trọng nhất của quá trình biên dịch là tạo ra kế hoạch truy vấn. Kế hoạch truy vấn, như tên cho thấy, cho biết cơ sở dữ liệu nên thực hiện truy vấn như thế nào (ví dụ: chỉ mục để sử dụng, các loại tham gia để sử dụng như tham số lồng nhau/băm/hợp nhất, v.v.). Điều này có thể mất thời gian khi cơ sở dữ liệu cần phân tích thông tin trên các bảng để đoán đúng về những gì là tối ưu (ví dụ: kích thước bảng, chỉ mục có sẵn, chỉ mục cụ thể, v.v ...).

Trong khi các câu lệnh chuẩn bị có thể tiết kiệm thời gian bạn phải cẩn thận vì đôi khi chúng có thể làm cho chương trình của bạn chậm hơn. Tại sao? Bởi vì không cung cấp giá trị mệnh đề where như là một phần của trình biên dịch, cơ sở dữ liệu phải đoán các giá trị bạn sẽ cung cấp và nó có thể chọn các giá trị dẫn đến một kế hoạch truy vấn tối ưu cho bạn.

Điều này có thể rõ ràng nhất đối với các truy vấn phạm vi. Ví dụ: giả sử bạn tạo một câu lệnh đã chuẩn bị với ngày tối thiểu và tối đa làm tham số. Truy vấn này bạn sẽ sử dụng để truy xuất một vài ngày giao dịch. Với phạm vi ngày nhỏ, truy vấn này có thể hiệu quả nhất để thực thi nếu cơ sở dữ liệu sử dụng chỉ mục ngày không được nhóm.

Tuy nhiên, vì cơ sở dữ liệu không biết bạn sẽ cung cấp thông số nào cho một phạm vi ngày lớn hơn nhiều (ví dụ: một năm trở lên). Trong trường hợp này, sử dụng câu lệnh đã chuẩn bị sẽ làm chậm chương trình của bạn (trừ khi bạn cung cấp gợi ý cho cơ sở dữ liệu về những tham số nào để tối ưu hóa hoặc chỉ rõ các chỉ mục nào sẽ sử dụng). Tất nhiên nếu trong tuyên bố chuẩn bị của bạn, các thông số bạn cung cấp sẽ trỏ đến các bản ghi riêng lẻ (ví dụ: các khóa duy nhất trên bảng), cơ sở dữ liệu thực sự không thể sai khi tạo kế hoạch truy vấn.

Tôi đoán tôi đang cố gắng nhấn mạnh rằng có những ưu và nhược điểm ở đây. PreparedStatements có thể nhanh hơn trong một số tình huống nhưng bạn phải cẩn thận.

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