Nó sẽ tốt hơn cho các kế hoạch truy vấn được phân chia bằng câu lệnh để tái sử dụng?


11

Từ kiến ​​thức hạn chế của tôi về cách các kế hoạch truy vấn được biên dịch, lưu trữ và truy xuất bởi các truy vấn Tôi hiểu rằng một truy vấn đa câu lệnh hoặc thủ tục được lưu trữ sẽ tạo ra kế hoạch truy vấn sẽ được lưu trữ trong bộ đệm của kế hoạch truy vấn để truy vấn sử dụng trong các lần thực hiện trong tương lai.

Tôi nghĩ rằng kế hoạch này được truy xuất từ ​​bộ đệm của kế hoạch truy vấn với hàm băm truy vấn, có nghĩa là nếu truy vấn được chỉnh sửa và thực hiện thì hàm băm khác nhau và một kế hoạch mới được tạo ra vì không thể tìm thấy hàm băm phù hợp trong bộ đệm của kế hoạch truy vấn.

Câu hỏi của tôi là: Nếu người dùng thực thi một câu lệnh là một trong những câu lệnh trong truy vấn đa câu lệnh thì nó có thể sử dụng phần có liên quan của kế hoạch truy vấn đã có trong bộ đệm cho truy vấn đa câu lệnh không? Tôi hy vọng câu trả lời là không bởi vì các giá trị băm rõ ràng sẽ không khớp, nhưng sẽ tốt hơn nếu băm từng câu lệnh trong một truy vấn đa câu lệnh để người dùng có thể sử dụng chúng để chạy các câu lệnh riêng lẻ từ truy vấn?

Tôi hy vọng có những điều phức tạp mà tôi không tính đến (Và đó là những điều tôi thực sự muốn biết) nhưng có vẻ như chúng ta có thể lưu trữ cùng một "kế hoạch tuyên bố" trong nhiều kế hoạch truy vấn chiếm nhiều không gian hơn và chiếm nhiều hơn CPU và thời gian để tạo.

Chỉ có thể được hiển thị sự thiếu hiểu biết của tôi mặc dù.


dbidobjectidcả hai đều is_cache_key=1vì vậy bạn sẽ không nhận được bất kỳ việc sử dụng lại các kế hoạch giữa các đối tượng được biên dịch khác nhau.
Martin Smith

Câu trả lời:


11

Nếu người dùng thực thi một câu lệnh là một trong các câu lệnh trong truy vấn đa câu lệnh thì nó có thể sử dụng phần có liên quan của kế hoạch truy vấn đã có trong bộ đệm cho truy vấn đa câu lệnh không?

Không. Đơn vị cơ bản của tái sử dụng gói trong SQL Server là .

Sẽ tốt hơn nếu băm từng câu lệnh trong một truy vấn nhiều câu lệnh để người dùng có thể sử dụng chúng để chạy các câu lệnh riêng lẻ từ truy vấn?

Một hệ thống được điều chỉnh để sử dụng lại kế hoạch ở mức cao sẽ đặt mã chung (ở mức độ chi tiết phù hợp) vào các đối tượng có thể sử dụng lại (ví dụ: thủ tục, hàm, trình kích hoạt) trên Máy chủ SQL. Nó cũng sẽ tham số hóa rõ ràng bất kỳ mã phía ứng dụng hoặc ứng dụng khách nào. Để tái sử dụng gói tối đa, các lô được tạo này chỉ khác nhau về giá trị tham số.

Tôi hy vọng có những biến chứng mà tôi không tính đến

Có vẻ như bạn đang hỏi tại sao SQL Server được thiết kế để lưu trữ và sử dụng lại ở cấp lô, thay vì ở cấp câu lệnh. Tôi nghi ngờ bất cứ ai ngoài các nhà thiết kế ban đầu có thể trả lời câu hỏi này một cách có thẩm quyền. Dù sao, đối với tôi, một lô là một mức độ chi tiết tự nhiên để sử dụng vì nó là đơn vị công việc tự nhiên tương đối khép kín và thể hiện sự đánh đổi hợp lý giữa độ phức tạp thực hiện và xác suất tái sử dụng kế hoạch.

Có một vài điều làm cho các lô không hoàn toàn khép kín (ví dụ: các bảng tạm thời cục bộ được tạo và được tham chiếu qua các ranh giới thủ tục được lưu trữ). Những ngoại lệ này làm giảm tính trực giao và có liên quan đến các hành vi và lỗi bất ngờ 'do thiết kế' trong nhiều năm qua.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.