Khi bạn bật tùy chọn " Tối ưu hóa cho khối lượng công việc học tập quảng cáo ", bạn sẽ khiến các truy vấn đặc biệt chạy lần thứ 2 chậm như lần 1, vì bạn sẽ Biên dịch Kế hoạch thực hiện và lấy cùng một Dữ liệu ( không có bộ nhớ cache) 2 lần đầu tiên.
Đây có thể không phải là một vấn đề lớn, nhưng bạn sẽ nhận thấy nó khi kiểm tra các truy vấn.
Vì vậy, điều gì xảy ra bây giờ, không có tùy chọn này được bật và bộ đệm chứa đầy các truy vấn Ad-Hoc 1-Off?
Thuật toán quản lý bộ đệm:
Khi tính năng Tối ưu hóa này được giới thiệu, thuật toán quản lý bộ đệm cũng được cập nhật.
Bài báo của Kimberly Tripp cũng tham khảo bài đăng của Kalen Delaney về sự thay đổi thuật toán này.
Cô giải thích nó tốt nhất:
Sự thay đổi thực sự tính toán kích thước bộ đệm của kế hoạch mà tại đó SQL Server nhận ra rằng có áp lực bộ nhớ và nó sẽ bắt đầu loại bỏ các gói khỏi bộ đệm. Các kế hoạch được loại bỏ là các kế hoạch giá rẻ chưa được sử dụng lại, và đây là một điều TỐT.
Điều này có nghĩa là những kế hoạch một thời gian phiền phức này sẽ là kế hoạch đầu tiên khi bạn cần giải phóng tài nguyên.
Vì vậy, bây giờ câu hỏi trở thành:
" Tại sao chúng tôi CẦN 'Tối ưu hóa cho khối lượng công việc của Ad Hoc' khi SQL Server xử lý loại bỏ các kế hoạch không sử dụng khi cần thiết? "
Câu trả lời của tôi là, nếu bạn thường xuyên có một loạt quảng cáo không được tạo tham số động -hoc truy vấn, sau đó nó có ý nghĩa hoàn hảo để bật tính năng này.
Bạn muốn tránh gây căng thẳng cho tài nguyên hệ thống, để nó buộc loại bỏ dữ liệu được lưu trong bộ nhớ cache sau khi bạn sử dụng hết dung lượng bộ nhớ cache tối đa.
Làm thế nào để tôi biết khi nào tôi cần bật cái này?
Đây là một truy vấn tôi đã viết để cho bạn biết có bao nhiêu Gói Ad-Hoc mà bạn hiện đã lưu trong bộ nhớ cache và dung lượng đĩa trống mà chúng đang ăn (kết quả sẽ thay đổi trong suốt cả ngày - vì vậy hãy kiểm tra nó trong thời gian tải nặng):
--Great query for making the argument to use "Optimize for Ad Hoc Workloads":
SELECT S.CacheType, S.Avg_Use, S.Avg_Multi_Use,
S.Total_Plan_3orMore_Use, S.Total_Plan_2_Use, S.Total_Plan_1_Use, S.Total_Plan,
CAST( (S.Total_Plan_1_Use * 1.0 / S.Total_Plan) as Decimal(18,2) )[Pct_Plan_1_Use],
S.Total_MB_1_Use, S.Total_MB,
CAST( (S.Total_MB_1_Use * 1.0 / S.Total_MB ) as Decimal(18,2) )[Pct_MB_1_Use]
FROM
(
SELECT CP.objtype[CacheType],
COUNT(*)[Total_Plan],
SUM(CASE WHEN CP.usecounts > 2 THEN 1 ELSE 0 END)[Total_Plan_3orMore_Use],
SUM(CASE WHEN CP.usecounts = 2 THEN 1 ELSE 0 END)[Total_Plan_2_Use],
SUM(CASE WHEN CP.usecounts = 1 THEN 1 ELSE 0 END)[Total_Plan_1_Use],
CAST((SUM(CP.size_in_bytes * 1.0) / 1024 / 1024) as Decimal(12,2) )[Total_MB],
CAST((SUM(CASE WHEN CP.usecounts = 1 THEN (CP.size_in_bytes * 1.0) ELSE 0 END)
/ 1024 / 1024) as Decimal(18,2) )[Total_MB_1_Use],
CAST(AVG(CP.usecounts * 1.0) as Decimal(12,2))[Avg_Use],
CAST(AVG(CASE WHEN CP.usecounts > 1 THEN (CP.usecounts * 1.0)
ELSE NULL END) as Decimal(12,2))[Avg_Multi_Use]
FROM sys.dm_exec_cached_plans as CP
GROUP BY CP.objtype
) AS S
ORDER BY S.CacheType
Các kết quả:
Tôi sẽ không nói, " Khi bạn có X MB " hoặc " Nếu X% Quảng cáo Học của bạn là Sử dụng một lần " để bật tính năng này.
Nó không ảnh hưởng đến Sprocs, Triggers, Lượt xem hoặc SQL được tham số hóa / Chuẩn bị - chỉ các truy vấn Ad-Hoc.
Đề nghị cá nhân của tôi là chỉ bật trong Môi trường Prod của bạn, nhưng xem xét tắt nó trong Môi trường Dev của bạn.
Tôi nói điều này chỉ dành cho Dev, bởi vì nếu bạn tối ưu hóa một truy vấn mất một phút hoặc hơn để chạy, thì bạn không muốn chạy nó 3 lần trước khi bạn có thể thấy nó sẽ chạy nhanh như thế nào với nó được lưu trong bộ nhớ cache - mỗi một lần bạn chỉnh sửa nó để tìm ra thiết kế tối ưu hóa tốt nhất.
Nếu công việc của bạn không liên quan đến việc này cả ngày, thì hãy tham gia và yêu cầu DBA của bạn bật nó ở mọi nơi.