Có cách nào để buộc một chỉ mục ở lại trong bộ nhớ với SQL Server 2008 không?


10

Tôi đã có một bảng với hàng triệu hàng, từ đó thỉnh thoảng tôi cần chạy một số truy vấn. Truy vấn đầu tiên thường sẽ khá chậm (khoảng 10 giây) và các truy vấn tiếp theo thường nhanh hơn (khoảng 1 giây). Sau một vài giờ, một chu kỳ chậm / sau đó nhanh chóng bắt đầu lại.

Tôi đã kiểm tra trong kế hoạch thực hiện của mình rằng tất cả các chỉ mục cần thiết đều có mặt và được sử dụng một cách thích hợp và tôi cho rằng sự khác biệt về hiệu suất là do thực tế là chỉ mục thực sự nằm trong bộ nhớ cho các truy vấn tiếp theo (tôi có đúng hay không nguyên nhân có thể?)

Tôi cũng đang chạy rất nhiều truy vấn khác bằng cách sử dụng các chỉ mục, nhưng các truy vấn đó ít tốn thời gian hơn và hiệu suất của chúng ít quan trọng hơn, vì vậy tôi lo ngại các chỉ mục đó thực sự đẩy chỉ mục quan trọng của tôi ra khỏi bộ nhớ cache.

Ngoài cách khắc phục 'thêm RAM' rõ ràng, tôi đã suy nghĩ về việc truy vấn các kịch bản giả để chạy mỗi giờ để buộc chỉ mục trở lại trong bộ nhớ.

Có một cách thanh lịch hơn để làm điều này? Giống như một cách để gợi ý SQLServer rằng nếu nó chỉ có đủ bộ nhớ để giữ một chỉ mục duy nhất được lưu trong bộ nhớ cache, thì nó có nên là một?

Tôi biết rằng thông thường, điều tốt nhất là không gây rối cho SQLServer liên quan đến loại điều đó, nhưng bản chất bất thường của truy vấn của tôi (rất hiếm khi xảy ra, nhưng rất quan trọng về thời gian) khiến tôi tin rằng nó sẽ có ý nghĩa (nếu có thể) .

Tôi cũng tò mò muốn biết liệu có cách nào để biết chỉ mục nào được lưu trong bộ nhớ tại một thời điểm nhất định không?

Câu trả lời:


13

Đã từng có một DBCC PINTABLElệnh nhưng tôi tin rằng đã ngừng hoạt động trong 6.5 hoặc có thể 7.0. Tuyên bố có thể vẫn sẽ gợi ý rằng nó hoạt động nếu bạn thử nó, nhưng nó chỉ trả về, nó thực sự là một no-op.

Thật không may, thực sự không có cách nào để kiểm soát chỉ mục nào được lưu trong bộ đệm - cách giải quyết tốt nhất mà tôi biết đối với các bảng đang nóng theo định kỳ là giữ cho chúng nóng theo cách thủ công (mà bạn đã mô tả trong câu hỏi của mình).

Đối với các chỉ mục trong bộ nhớ, bạn có thể có được một ý tưởng sơ bộ từ sys.sm_os_buffer_descriptors. Tôi đã xuất bản một mẹo về điều này:

http://www.mssqltips.com/sqlservertip/2393/determine-sql-server-memory-use-by-database-and-object/


Hmm, theo kịch bản đó, một bảng 75 MB đang chiếm 900 MB vùng đệm. Điều đó có bình thường / có thể không?
db2

1
@ db2 bạn có bao nhiêu chỉ mục?
JNK

2
Ngoài ra, nó bị phân mảnh như thế nào ... đó là các trang đo lường, không phải dữ liệu. Các trang của bạn có thể tương đối trống và điều đó có thể góp phần vào một biện pháp tăng cao.
Aaron Bertrand

0

Hãy thử sử dụng KEEPPLANKEEPPLAN FIXED gợi ý truy vấn .

KEEPPLAN buộc trình tối ưu hóa truy vấn phải nới lỏng ngưỡng biên dịch lại ước tính cho một truy vấn.

KẾ HOẠCH KEEPFIXED buộc trình tối ưu hóa truy vấn không biên dịch lại truy vấn do thay đổi trong thống kê. Chỉ định KẾ HOẠCH KEEPFIXED đảm bảo rằng một truy vấn sẽ chỉ được biên dịch lại nếu lược đồ của các bảng bên dưới bị thay đổi hoặc nếu sp_recompile được thực thi đối với các bảng đó.

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.