khi không còn bộ nhớ vật lý cho dữ liệu, thì SQL Server sẽ chuyển dữ liệu đã có vào TEMPDB
Bài viết bạn liên kết đến là sai lệch ở mức tốt nhất, và không chính xác ở một số nơi. Tôi nghĩ rằng tác giả đã cố gắng đơn giản hóa quá mức một số điều phức tạp, và khi làm như vậy đã đi quá xa.
SQL Server không di chuyển dữ liệu từ bộ nhớ (vùng đệm) vào tempdb theo cách đó. Nó sử dụng chiến lược bộ nhớ đệm "ít được sử dụng gần đây" (nói chung), vì vậy nếu có áp lực bộ nhớ và dữ liệu mới cần được kéo vào bộ nhớ, SQL Server sẽ loại bỏ dữ liệu LRU từ nhóm bộ đệm để chứa dữ liệu mới. Hành vi này thường được theo dõi bởi một bộ đếm perfmon có tên là "Tuổi thọ trang" (PLE) :
Định nghĩa của PLE là thời gian dự kiến, tính bằng giây, một trang tệp dữ liệu được đọc vào vùng đệm (bộ nhớ cache trong bộ nhớ của các trang tệp dữ liệu) sẽ vẫn còn trong bộ nhớ trước khi bị đẩy ra khỏi bộ nhớ để nhường chỗ cho dữ liệu khác trang tập tin. Một cách khác để nghĩ về PLE là một biện pháp tức thời về áp lực lên vùng đệm để tạo không gian trống cho các trang được đọc từ đĩa. Đối với cả hai định nghĩa này, một số cao hơn là tốt hơn.
Trong quá trình thực hiện truy vấn, SQL Server có thể sử dụng tempdb cho các hoạt động nhất định. Điều này thường được thực hiện nếu ước tính là xấu, nhưng bộ nhớ khả dụng thấp có thể ảnh hưởng đến hành vi này.
Một số thao tác có thể "tràn" sang tempdb theo cách này là băm các hàng (cho phép nối hoặc tổng hợp, v.v.), sắp xếp các hàng trong bộ nhớ và đệm các hàng trong khi thực hiện truy vấn song song.
Các truy vấn của người dùng cũng có thể sử dụng tempdb một cách rõ ràng (với các bảng tạm thời toàn cầu hoặc cục bộ) và ngầm sử dụng tempdb (với các mức độ cách ly ảnh chụp nhanh hoặc đọc cam kết).
Cả hai tình huống này thực sự không phù hợp với tuyên bố bạn đã trích dẫn.
khi không còn đủ bộ nhớ vật lý, hệ điều hành có thể sử dụng PAGE FILE và di chuyển dữ liệu từ bộ nhớ vật lý sang nó
Điều này chắc chắn có thể xảy ra và phần lớn nằm ngoài sự kiểm soát của SQL Server. Có một nút bạn có thể xoay để cố gắng ngăn một số loại phân trang cấp hệ điều hành, cụ thể là bật "Khóa trang trong bộ nhớ" (LPIM) :
Chính sách Windows này xác định tài khoản nào có thể sử dụng một quy trình để giữ dữ liệu trong bộ nhớ vật lý, ngăn hệ thống phân trang dữ liệu sang bộ nhớ ảo trên đĩa.
Vì vậy, những gì chúng ta có thể ngăn chặn được phân trang vào đĩa?
Trước SQL Server 2012, các trang được phân bổ thông qua một thành phần được gọi là "Phân bổ trang đơn" đã bị khóa trong bộ nhớ (không thể phân trang). Điều này bao gồm nhóm bộ đệm (trang cơ sở dữ liệu), bộ đệm thủ tục và một số vùng bộ nhớ khác.
Xem Vui với các trang bị khóa, AWE, Trình quản lý tác vụ và Cài đặt làm việc để biết chi tiết, đặc biệt là phần "4. Bây giờ tôi biết rằng SQL Server trên x64 có thể sử dụng các trang bị khóa Khóa, chính xác là gì đã bị khóa?" Đọc thêm liên quan có thể được tìm thấy ở đây: Cuộc tranh luận về máy chủ SQL tuyệt vời: Khóa trang trong bộ nhớ
Trong SQL Server 2012 trở lên, không có "Bộ phân bổ trang đơn" (bộ cấp phát một trang và nhiều trang được hợp nhất, theo cái nhìn sâu về bộ nhớ - SQL Server 2012/2014 ). Các chi tiết về những gì, chính xác, có thể và không thể được phân trang không được ghi lại chi tiết ở bất cứ nơi nào tôi thấy. Bạn có thể sử dụng một truy vấn như thế này để xem những gì đang khóa:
select osn.node_id, osn.memory_node_id, osn.node_state_desc, omn.locked_page_allocations_kb
from sys.dm_os_memory_nodes omn
inner join sys.dm_os_nodes osn on (omn.memory_node_id = osn.memory_node_id)
where osn.node_state_desc <> 'ONLINE DAC'
Trên cùng một bài viết Hỗ trợ MS, bạn cũng có thể sử dụng DBCC MEMORYSTATUS
để xem dung lượng bộ nhớ bị "khóa".
Là một lưu ý phụ, bạn có thể thấy bằng chứng về bộ làm việc của SQL Server đang được HĐH phân trang trong nhật ký lỗi. Sẽ có những thông điệp giống như thế này:
2019-09 / 02 10: 19: 27,29 spid11s Một phần đáng kể của bộ nhớ quy trình máy chủ sql đã được phân trang. Điều này có thể dẫn đến suy giảm hiệu suất. Thời lượng: 329 giây. Bộ làm việc (KB): 68780, cam kết (KB): 244052, sử dụng bộ nhớ: 28%.