Khi bạn thực hiện truy vấn của mình, dữ liệu được đọc vào bộ nhớ trong các khối. Những khối này vẫn còn trong bộ nhớ nhưng chúng bị "già đi". Điều này có nghĩa là các khối được gắn thẻ với lần truy cập cuối cùng và khi Máy chủ Sql yêu cầu một khối khác cho một truy vấn mới và bộ nhớ đệm bị đầy, khối ít được sử dụng gần đây nhất (khối cũ nhất) sẽ bị loại bỏ khỏi bộ nhớ. (Trong hầu hết các trường hợp - các khối quét toàn bảng được xác định tuổi ngay lập tức để ngăn chặn việc quét toàn bảng làm tràn bộ nhớ và làm nghẹt máy chủ).
Điều đang xảy ra ở đây là các khối dữ liệu trong bộ nhớ từ truy vấn đầu tiên vẫn chưa bị loại bỏ khỏi bộ nhớ nên có thể được sử dụng cho truy vấn thứ hai của bạn, nghĩa là tránh được việc truy cập đĩa và cải thiện hiệu suất.
Vì vậy, câu hỏi của bạn thực sự đang đặt ra là "tôi có thể lấy các khối dữ liệu tôi cần vào bộ nhớ mà không cần đọc chúng vào bộ nhớ (thực sự là thực hiện một truy vấn) không?". Câu trả lời là không, trừ khi bạn muốn lưu vào bộ nhớ cache toàn bộ bảng và để chúng nằm trong bộ nhớ vĩnh viễn, từ thời gian truy vấn (và do đó kích thước dữ liệu) mà bạn đang mô tả, có lẽ không phải là một ý kiến hay.
Đặt cược tốt nhất của bạn để cải thiện hiệu suất là xem xét các kế hoạch thực thi truy vấn của bạn và xem liệu việc thay đổi các chỉ mục của bạn có thể mang lại kết quả tốt hơn hay không. Có hai lĩnh vực chính có thể cải thiện hiệu suất ở đây:
- tạo một chỉ mục trong đó truy vấn có thể sử dụng một chỉ mục để tránh các truy vấn không hiệu quả và quét toàn bộ bảng
- thêm nhiều cột vào một chỉ mục để tránh đĩa thứ hai bị đọc. Ví dụ:bạn có truy vấn trả về cột A và B với mệnh đề where trên A và C và bạn có chỉ mục trên cột A. Truy vấn của bạn sẽ sử dụng chỉ mục cho cột A yêu cầu một đĩa đọc nhưng sau đó yêu cầu đĩa thứ hai Nhấn để lấy các cột B và C. Nếu chỉ mục có tất cả các cột A, B và C trong đó thì có thể tránh được lần nhấn đĩa thứ hai để lấy dữ liệu.