SQL Server 目標/總伺服器記憶體不等於 dm_os_buffer_descriptors 中數據庫大小的總和
我在我的 SQL Server 中遇到問題,例如高記憶體分頁率和更多編譯/秒,這導致我在記憶體中觀察到不同的情況,所以首先我檢查了系統記憶體的總大小以及 SQL 中設置的門檻值級別是多少伺服器,即最小伺服器記憶體 4096 MB 和最大伺服器記憶體 51200 MB,我檢查了幾個性能計數器,總伺服器記憶體為 64 GB,目標伺服器記憶體為 53 GB,其他性能計數器如下圖所示
當我在 SQL Server 中檢查 sys.dm_os_buffer_descripters 時,臟頁非常少,但是當我檢查所有數據庫佔用的記憶體總大小為 39 GB 時,如下圖所示
我的問題是 SQL Server 為什麼以及如何另外佔用 14 GB 的記憶體,並且我可以在資源監視器或性能計數器中使用相同的記憶體,如下圖所示。
誰能告訴我我錯過了什麼要檢查的東西,總數據庫只佔用 39 GB,但如果我檢查 perfmon 或資源監視器,它顯示 SQL Server 總共佔用 53 GB,如何在內部使用 14 GB。
sys.dm_os_buffer_descriptors
來自sys.dm_os_buffer_descriptors (Transact-SQL)的官方文件:
sys.dm_os_buffer_descriptors 返回資源數據庫正在使用的頁面。sys.dm_os_buffer_descriptors 不返回有關免費或被盜頁面的資訊,或者有關在讀取時出錯的頁面的資訊。
您正在查看數據記憶體使用情況。但是記憶體中的對像不僅僅是數據。
sys.dm_exec_cached_plans
您必須考慮計劃記憶體(sys.dm_exec_cached_plans (Transact-SQL))和其他對象。
為 SQL Server 記憶體的每個查詢計劃返回一行,以便更快地執行查詢。您可以使用此動態管理視圖來查找記憶體的查詢計劃、記憶體的查詢文本、記憶體計劃佔用的記憶體量以及記憶體計劃的重用計數。
可以使用以下腳本檢索記憶體計劃獲取的記憶體:
SELECT plan_handle, ecp.memory_object_address AS CompiledPlan_MemoryObject, omo.memory_object_address、pages_allocated_count、type、page_size_in_bytes FROM sys.dm_exec_cached_plans AS ecp 加入 sys.dm_os_memory_objects AS omo ON ecp.memory_object_address = omo.memory_object_address 或 ecp.memory_object_address = omo.parent_address WHERE cacheobjtype = '編譯計劃'; 走
sys.dm_os_memory_clerks
但是,您可能需要考慮查詢視圖,而不是查看單個記憶體:sys.dm_os_memory_clerks
SQL Server 記憶體管理器由三層層次結構組成。層次結構的底部是記憶體節點。中間層由記憶體職員、記憶體記憶體和記憶體池組成。頂層由記憶體對象組成。這些對象通常用於在 SQL Server 實例中分配記憶體。
sys.dm_os_memory_objects
… SQL Server 組件使用記憶體對象而不是記憶體職員。記憶體對象使用記憶體管理員的頁面分配器介面來分配頁面。記憶體對像不使用虛擬或共享記憶體介面。根據分配模式,組件可以創建不同類型的記憶體對象來分配任意大小的區域。
使用以下查詢查看sys.dm_os_memory_objects (Transact-SQL) 在 RAM 中使用的內容。
選擇 SUM (pages_in_bytes) 作為“使用的字節數”,鍵入 FROM sys.dm_os_memory_objects 按類型分組 ORDER BY 'Bytes Used' DESC; 走
概括
因此,雖然 sys.dm_os_buffer_descriptors 確實提供了數據cahce 的概述,但您必須查詢其他 sys 視圖以確定目前的實際記憶體使用情況。
您的 SQL Server 實例可能曾經佔用 53 GB 的 RAM,但它現在僅消耗 39 GB 的 RAM(在數據記憶體中)和更多 GB 的計劃記憶體和記憶體對象,總計可能達到 53 GB RAM,但由於 RAM 中的空閒頁面可能還沒有被 SQL Server 釋放,因此總和可能會更少。
sys.dm_os_buffer_descripters 為您提供緩衝池使用情況,而不是總記憶體使用情況。不要假設此 DMV 的結果是數據庫引擎的總記憶體使用情況。SQL Server 執行和使用記憶體的還有很多其他事情。
Total 將是緩衝池和非緩衝池使用量的總和。