Do SQL Server lưu trữ thủ tục lưu trữ kết quả dữ liệu?


11

Tôi đã nghe điều này từ bạn bè, nhưng tôi chưa bao giờ điều tra liệu điều này có đúng không.

Có đúng là kết quả dữ liệu của một truy vấn được thực hiện được lưu trữ trong bộ đệm không?

Ý tôi là, nếu tôi có một thủ tục được lưu trữ như:

SELECT * FROM USERLIST

... có đúng là kết quả (danh sách người dùng, trong trường hợp này) được lưu trữ trong bộ đệm.

Ngoài ra, nếu tôi có những thứ này:

SELECT * FROM USERLIST WHERE user="user"
SELECT * FROM USERLIST WHERE user="userzzz"

(trong đó user / userzzz được truyền dưới dạng tham số), có đúng không khi nó lưu 2 kết quả khác nhau trên bộ đệm cơ sở dữ liệu.

Tôi không nghĩ vậy, nhưng tôi muốn sự xác nhận từ các chuyên gia!


vừa trả lời ngay cho bạn bằng marc_s stackoverflow.com/questions/8559443/ cấp

Câu trả lời:


19

Kết quả truy vấn không được lưu trữ

Tuy nhiên, bảng nguồn và dữ liệu chỉ mục và siêu dữ liệu sẽ được lưu trong bộ nhớ cache sau lần sử dụng đầu tiên (mặc dù vẫn tiếp tục sử dụng, tải và áp lực bộ nhớ)

Nghĩa là, kết quả của một truy vấn sẽ được đánh giá mỗi lần thực hiện nhưng (các) bảng (và bất kỳ chỉ mục nào, v.v.) được sử dụng bởi truy vấn rất có thể sẽ có trong bộ nhớ.

Kế hoạch thực hiện được biên dịch sẽ được lưu vào bộ nhớ cache, đó là nơi mà sự nhầm lẫn xuất phát từ tôi nghi ngờ


"Nghĩa là, kết quả của một truy vấn sẽ được đánh giá mỗi lần thực hiện nhưng (các) bảng (và bất kỳ chỉ mục nào, v.v.) được sử dụng bởi truy vấn rất có thể sẽ có trong bộ nhớ." : vâng, tôi cũng không sử dụng SP Tôi đoán ... đó là tối ưu hóa cơ sở dữ liệu, điều đó không quan trọng với Sp, phải không?

@markzzz: gần như tất cả SQL được biên dịch thành kế hoạch thực hiện, cho dù là CẬP NHẬT trực tiếp, CHỌN hoặc thủ tục được lưu trữ
gbn

6

Khi một thủ tục được lưu trữ được thực thi, nó được tối ưu hóa và biên dịch và kế hoạch truy vấn được đặt trong bộ đệm thủ tục.

Các thủ tục vẫn còn trong bộ nhớ cache cho người dùng khác, miễn là có không gian. Các thủ tục được loại bỏ bằng thuật toán ít được sử dụng gần đây nhất (LRU).


Mặc dù việc thực thi ban đầu của một thủ tục được lưu trữ đòi hỏi phải truy xuất từ ​​sysprocedures trên đĩa, nhưng có thể, đối với các lần thực hiện tiếp theo, chỉ cần lấy lại kế hoạch được tối ưu hóa từ bộ đệm thủ tục. Hành vi này có thể dẫn đến tăng hiệu suất đáng kể.

Vì vậy, những gì trong bộ đệm là kế hoạch được tối ưu hóa từ thủ tục được lưu trữ chứ không phải kết quả của thủ tục được lưu trữ.


6

Khi một truy vấn đã sẵn sàng để được SQL Server xử lý, Trình quản lý SQL sẽ tìm kiếm nó cache; và nếu nó không ở đó, nó phải được biên dịch. Quá trình biên dịch bao gồm một vài điều.

Khi một thủ tục lưu trữ được thực thi, nó được tối ưu hóa và biên dịch. theo đó một kế hoạch truy vấn được đặt trong bộ đệm thủ tục.

Kiểm tra Compilation and Executionphần trên Kiến trúc và Bộ xử lý truy vấn Microsoft SQL Server để biết thông tin chi tiết về xử lý truy vấn, v.v.

Sản phẩm cuối cùng của giai đoạn biên dịch là một kế hoạch truy vấn, được đưa vào bộ đệm thủ tục. Kết quả / hoạt động truy vấn SQL có thể có kích thước tính bằng MB, GB để nó không được đặt trong bộ đệm thủ tục hoặc gói truy vấn.

Kiểm tra sơ đồ sau (từ MSDN) để thực hiện thủ tục được lưu trữ để xóa câu hỏi của bạn: nhập mô tả hình ảnh ở đây


-1

SQL Server về cơ bản trải qua các bước này để thực hiện bất kỳ truy vấn nào (cuộc gọi thủ tục được lưu trữ hoặc câu lệnh SQL ad-hoc):

1) về mặt cú pháp kiểm tra truy vấn
2) nếu nó ổn - nó kiểm tra bộ đệm của kế hoạch để xem nó đã có kế hoạch thực hiện cho truy vấn đó chưa
3) nếu có kế hoạch thực hiện - kế hoạch đó được sử dụng và truy vấn được thực hiện
4) nếu chưa có kế hoạch, kế hoạch thực hiện được xác định
5) kế hoạch đó được lưu vào bộ đệm của kế hoạch để sử dụng lại sau
6) truy vấn được thực hiện

(bản sao câu trả lời của Marc_s)


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.