Kích thước bộ đệm thủ tục (kế hoạch bộ đệm)


7

Tôi đang phát triển một ứng dụng với nhiều truy vấn SQL phức tạp, được lắp ráp theo kiểu dinamycally. Tôi muốn giữ các kế hoạch truy vấn trong bộ đệm thủ tục càng lâu càng tốt. Để ngăn việc loại bỏ các gói truy vấn khỏi bộ đệm thủ tục (vì áp lực bộ nhớ), tôi muốn phân bổ đủ bộ nhớ cho bộ đệm thủ tục. Theo đó, chỉ 10% bộ nhớ "mục tiêu hiển thị" trong phạm vi 4Gb-64GB được sử dụng cho bộ đệm thủ tục; Tôi muốn tỷ lệ này cao hơn.

Có cách nào để có một số kiểm soát về kích thước của bộ đệm thủ tục không? Máy chủ SQL 2008 hoặc 2012; có thể một số tính năng Enterprise Edition?

Ngoài ra, cũng áp dụng quy tắc "10% bộ nhớ mục tiêu hiển thị" này, nếu tôi đặt rõ ràng mức tối thiểu. bộ nhớ cho máy chủ SQL?

(Tôi biết các gợi ý KEEP PLAN / KEEPFIXED kích thước.)


1
Còn việc sử dụng tùy chọn "tối ưu hóa cho khối lượng công việc ad hoc" thì sao? Điều này đặt các cuống nhỏ hơn nhiều trong bộ đệm cho đến khi cùng một gói được sử dụng nhiều lần và chỉ sau đó nó mới lưu toàn bộ bộ đệm. Theo cấu hình mặc định và đặc biệt là trong trường hợp có nhiều SQL được lắp ráp động, các gói sử dụng một lần thường lãng phí rất nhiều không gian trong bộ đệm. Nếu bạn giảm lượng không gian lãng phí mà chúng chiếm giữ, bạn sẽ dành nhiều chỗ hơn cho các kế hoạch được sử dụng nhiều lần và đó chính xác là những kế hoạch bạn muốn giữ xung quanh.
Aaron Bertrand

cảm ơn, nhưng tôi không có các truy vấn đặc biệt sẽ làm lãng phí tài nguyên bộ đệm thủ tục

1
Sau đó, bạn có thể giải thích ý của bạn bằng "các truy vấn SQL phức tạp được lắp ráp theo kiểu dinamycally" không? Nghe có vẻ giống như các truy vấn ad hoc với tôi. (Và đó là sự thật cho dù bạn đang trình quảng cáo hoc SQL từ một ứng dụng hoặc xây dựng quảng cáo hoc SQL từ bên trong một thủ tục lưu trữ.) Xem bài này để xem nếu bạn có những kế hoạch thực thay vì chỉ giải thích của bạn về những gì các phương tiện thiết lập: sqlskills .com / blog / kimberly / post / Nhận
Aaron Bertrand

Vâng, tôi có một cơ chế tự động tạo ra các truy vấn. Khi một truy vấn được tạo ra, đôi khi nó phù hợp với cấu trúc của truy vấn trước đó; và đôi khi nó có cấu trúc mới. Vì giai đoạn tạo kế hoạch truy vấn mất nhiều thời gian, tôi muốn sử dụng lại các kế hoạch truy vấn trước đó càng nhiều càng tốt. Tôi có rất nhiều bộ nhớ phisycal, vì vậy sẽ khá hợp lý khi sử dụng nó cho mục đích này.

3
"Tôi không muốn thay đổi câu hỏi của mình" .. đó là "Tôi đã hỏi một câu hỏi tồi" ... Đó là cơ sở để đóng cửa là không có ích cho bất kỳ ai khác trong tương lai.
jcolebrand

Câu trả lời:


8

Bạn không thể kiểm soát kích thước bộ nhớ cache theo cách thủ công. Mục Kết nối sau đây mô tả cả thực tế là họ sẽ không thêm núm bất kỳ lúc nào và Thống đốc tài nguyên có thể hữu ích một chút trong một số trường hợp sử dụng hẹp:

http://connect.microsoft.com/QueryServer/feedback/details/293188/amount-of-ram-for-procedure-cache-should-be-configurable

Tuy nhiên, như tôi đã đề cập trong các bình luận, có nhiều cách khác để bạn có thể làm cho bộ đệm kế hoạch hiệu quả hơn (ví dụ: sử dụng cài đặt "tối ưu hóa cho khối lượng công việc ad hoc" ). Kimberly giải thích điều này chi tiết hơn, nhưng về cơ bản, cài đặt này đặt các cuống nhỏ hơn nhiều trong bộ đệm cho đến khi cùng một kế hoạch được sử dụng nhiều lần, và chỉ sau đó nó mới lưu trữ toàn bộ. Theo cấu hình mặc định và đặc biệt là trong trường hợp có nhiều SQL được lắp ráp động, các gói sử dụng một lần thường lãng phí rất nhiều không gian trong bộ đệm. Nếu bạn giảm lượng không gian lãng phí mà chúng chiếm giữ, bạn sẽ dành nhiều chỗ hơn cho các kế hoạch được sử dụng nhiều lần và đó chính xác là những kế hoạch bạn muốn giữ xung quanh.


Vấn đề MS đã bị đóng cửa vào năm 2007. Bạn có chắc chắn rằng trong phiên bản 2012 (hay 2012 Enterprise Edition) vẫn không có khả năng đó?

Vâng tôi chắc chắn. Quản lý bộ nhớ được cải thiện rất nhiều trong SQL Server 2012, nhưng vẫn không có kiểm soát nào được hiển thị cho kích thước của bộ đệm kế hoạch. (Mặc dù tôi tin rằng Sybase có tùy chọn cấu hình máy chủ tương tự.)
Aaron Bertrand

Bạn có thể biết quy tắc "10% bộ nhớ mục tiêu hiển thị" hoạt động như thế nào không, nếu tôi cũng đặt min. bộ nhớ cho máy chủ SQL? Ví dụ: Nếu tôi có 16GB RAM và tôi đặt min. bộ nhớ cho SQL Server tới 14 GB, mức tối đa sẽ là bao nhiêu. kích thước của bộ đệm thủ tục? Nó sẽ là 4GB tế bào * 75% + (16-4) GBytes * 10% = 4.2GBytes (bất kể cài đặt bộ nhớ tối thiểu)?

@slobo Vì bạn không thể kiểm soát nó, tôi vẫn nghĩ rằng bạn đang hỏi sai câu hỏi - và không phải là tôi quá lười để làm toán, tôi chỉ nghĩ rằng nó là vô nghĩa - nếu câu trả lời là 4.2GB hoặc 4.4GB hoặc 3,95 GB, bạn sẽ làm gì khác nhau? <nhún>
Aaron Bertrand

Tôi đã hy vọng rằng nếu tôi đặt min. bộ nhớ cho SQL Server, cách tính khác nhau và bộ đệm thủ tục sẽ lớn hơn nhiều.

4

FYI, nếu bạn cần tìm ra kích thước của bộ đệm thủ tục, hãy chạy lệnh sau:

dbcc memorystatus

Nó sẽ cho bạn biết kích thước của bộ đệm thủ tục được đo bằng các trang - để chuyển đổi thành KB nhân con số này với 8.

Nó cũng cho bạn biết có bao nhiêu thủ tục được lưu trong bộ nhớ cache có thể hữu ích vì nhiều lý do bao gồm cả nếu bạn đang cố gắng tìm hiểu xem có quá nhiều truy vấn đặc biệt chạy trên cơ sở dữ liệu hay không.

Nếu bạn muốn điều chỉnh phần trăm bộ nhớ được sử dụng bởi bộ đệm thủ tục thì hãy điều chỉnh bộ nhớ MAX (không phải bộ nhớ tối thiểu) có sẵn cho máy chủ. 75% 4GB đầu tiên có sẵn cho bộ đệm thủ tục và 10% mọi thứ khác. Tôi không thấy bất kỳ lợi thế để làm điều này tuy nhiên. Về lý thuyết, bạn có thể cài đặt nhiều phiên bản SQL Server với bộ nhớ tối đa 4GB để có được dung lượng 75% bộ nhớ được sử dụng bởi bộ đệm thủ tục .... Tôi không thấy lợi thế nhưng sau đó tôi không thấy biết hệ thống của bạn. Có vẻ như bạn đã có RẤT NHIỀU logic kinh doanh trong lớp cơ sở dữ liệu.


Trên thực tế tôi không có logic nghiệp vụ trong tầng cơ sở dữ liệu, nhưng tôi có các CHỌN SQL thực sự lớn và tôi có nhiều trong số chúng và chúng được sử dụng nhiều lần.
slobo
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.