Sql-Server
在具有 500GB RAM 的伺服器上,SQL Server 計劃記憶體大小僅為 4GB
我有一個 SQL Server 2016 SP1,它已經啟動並執行了一年多,使用下面的查詢,我看到計劃記憶體大小大約只有 4GB,而物理伺服器有 500GB,並且 sql 上沒有最大記憶體設置實例,伺服器上只有一個 sql 實例,沒有其他應用程序。
我的理解是基於 sql server 如何使用下面的公式確定計劃記憶體的大小,我的伺服器上的計劃記憶體應該至少 30GB 或更多,但 sql server 只分配了 4GB,我混合了 SP、sp_executesql 和 exec(sql) 查詢在分貝上。請專家幫我理解為什麼計劃記憶體會這麼小。謝謝!
SQL Server 2005 SP2 and higher 75% of visible target memory from 0-4GB + 10% of visible target memory from 4GB-64GB + 5% of visible target memory > 64GB
SELECT [objtype] AS [CacheType], COUNT_BIG(*) AS [Total Plans], SUM(CAST([size_in_bytes] AS DECIMAL(18,2)))/1024/1024 AS [Total MBs], AVG([usecounts]) AS [Avg Use Count], SUM(CAST((CASE WHEN [usecounts] = 1 THEN [size_in_bytes] ELSE 0 END) AS DECIMAL(18,2)))/1024/1024 AS [Total MBs – USE Count 1], SUM(CASE WHEN [usecounts] = 1 THEN 1 ELSE 0 END) AS [Total Plans – USE Count 1] FROM [sys].[dm_exec_cached_plans] GROUP BY [objtype] ORDER BY [Total MBs – USE Count 1] DESC;
SQL Server 僅在需要時使用記憶體……以記憶體技術為例外,它不會跳轉到使用配置中指示的所有記憶體以獲得最大伺服器記憶體(甚至最小伺服器記憶體),直到您實際上請求需要記憶體的數據或計劃。
因此,如果 SQL Server 很長時間沒有啟動(可能您每晚重新啟動,或者最近安裝的更新檔),它不會使用該記憶體,直到您的工作負載發生。而且它可能永遠不會發生,具體取決於您的可用記憶體和數據大小。例如,如果您為 SQL Server 分配了 30GB,但您的數據總和僅為 10GB,那麼無論正常執行時間如何,您都不太可能看到所有最大伺服器記憶體都已被使用。
SQL Server 記憶體管理的其中幾個方面被廣泛誤解。