Các trang được đọc vào bộ nhớ theo yêu cầu, nếu không có bộ nhớ trống, trang chưa sửa đổi cũ nhất sẽ được thay thế bằng trang đến.
Điều này có nghĩa là nếu bạn thực hiện một truy vấn yêu cầu nhiều dữ liệu hơn mức có thể phù hợp với bộ nhớ, nhiều trang sẽ có tuổi thọ rất ngắn trong bộ nhớ, dẫn đến rất nhiều I / O.
Bạn có thể thấy hiệu ứng này bằng cách xem bộ đếm "Tuổi thọ trang" trong Windows Performance Monitor. Hãy xem https://sqlperformance.com/2014/10/sql-performance/knee-jerk-page-life-Exectancy để biết một số chi tiết tuyệt vời về bộ đếm đó.
Trong các bình luận, bạn đã hỏi cụ thể điều gì xảy ra khi kết quả của truy vấn lớn hơn không gian bộ đệm có sẵn. Lấy ví dụ đơn giản nhất, select * from some_very_big_table;
- giả sử bảng là 32 GB và max server memory (MB)
được định cấu hình ở mức 24 GB. Tất cả 32GB dữ liệu bảng sẽ được đọc vào các trang trong bộ đệm trang một lần, được chốt, được định dạng vào các gói mạng và được gửi qua dây. Điều này xảy ra từng trang một; bạn có thể có 300 truy vấn như vậy chạy cùng một lúc và giả sử không có chặn nào xảy ra, dữ liệu cho mỗi truy vấn sẽ được đọc vào không gian bộ đệm trang, một trang và đưa vào dây nhanh nhất có thể yêu cầu và tiêu thụ dữ liệu. Khi tất cả dữ liệu từ mỗi trang đã được gửi lên dây, trang sẽ không được nối và sẽ nhanh chóng được thay thế bởi một số trang khác từ đĩa.
Trong trường hợp truy vấn phức tạp hơn, giả sử, ví dụ tổng hợp kết quả từ một số bảng, các trang sẽ được kéo vào bộ nhớ chính xác như trên theo yêu cầu của bộ xử lý truy vấn. Nếu bộ xử lý truy vấn cần không gian làm việc tạm thời để tính kết quả, nó sẽ biết rằng trả trước khi nó biên dịch một kế hoạch cho truy vấn và sẽ yêu cầu không gian làm việc (bộ nhớ) từ SQLOS . Tại một thời điểm nào đó, SQLOS (giả sử không hết thời gian ), cấp bộ nhớ đó cho bộ xử lý truy vấn, tại đó quá trình xử lý truy vấn sẽ tiếp tục. Nếu bộ xử lý truy vấn mắc lỗi trong ước tính dung lượng bộ nhớ cần yêu cầu từ SQLOS, thì có thể cần phải thực hiện "tràn vào đĩa"hoạt động, trong đó dữ liệu tạm thời được ghi vào tempdb ở dạng trung gian. Các trang đã được ghi vào tempdb sẽ được hủy theo dõi khi chúng được ghi vào tempdb để nhường chỗ cho các trang khác được đọc vào bộ nhớ. Cuối cùng, quá trình truy vấn sẽ trở về dữ liệu được lưu trữ trong tempdb, phân trang rằng bằng cách sử dụng chốt, vào các trang trong bộ đệm được đánh dấu miễn phí.
Tôi chắc chắn thiếu một tải các chi tiết rất kỹ thuật trong bản tóm tắt ở trên, nhưng tôi nghĩ rằng nắm bắt được bản chất của cách SQL Server có thể xử lý nhiều dữ liệu hơn mức có thể phù hợp với bộ nhớ.