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?