Tôi nghĩ những gì ông ta nói là, khi bạn sử dụng báo cáo đã chuẩn bị, máy chủ SQL có thể lưu trữ kế hoạch thực thi truy vấn của bạn, vì vậy, ngay cả khi bạn sửa đổi một số tham số trên truy vấn thực hiện, máy chủ có thể chọn sai được lưu vào bộ nhớ cache) kế hoạch thực hiện sẽ thực hiện rất nặng.
Ông cũng đề cập đến một tính năng mới của SQL Server 2008 để buộc động cơ phải đánh giá lại các kế hoạch thực hiện mà ông đã sử dụng để khắc phục tình trạng này.
Với báo cáo được chuẩn bị, vấn đề duy nhất tôi có là vấn đề này. Hãy xem xét Mã Java sau:
String sql = "select * from table where name like ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "PATTERN%");
ResultSet rs = pstmt.executeQuery();
Ở đây bạn có thể mong đợi, nếu bạn có chỉ mục trên bảng (tên) nó sẽ được kế hoạch truy vấn sử dụng. Vâng, nó sẽ không. Bởi vì PraparedStatement phải biên dịch trước và mong đợi điều tồi tệ nhất: ví dụ '% PATTERN%'. Vì vậy, nó sẽ không tối ưu hóa. Phải mất một lúc tôi mới hiểu được điều này. Nó đã gây ra cơ sở dữ liệu của tôi bị ảnh hưởng. :(
Hy vọng điều đó sẽ giúp ích.
Nguồn
2009-03-24 17:37:48