我的 SQL 需要多少内存?

kra*_*626 4 memory vmware-vsphere sql-server-2012 windows-server-2012-r2

我有一个虚拟机(SQL 数据库服务器),我认为它的内存比它需要的要多,但是我不确定我可以将它减少到什么程度,因为我不明白什么是“正在使用”、“可用”、“已提交” ”和“缓存”内存的意思。

下面是我做了一些负载测试后任务管理器的屏幕截图。让我们假设负载不会比这更剧烈。

在此处输入图片说明

对我来说很明显 64GB 的 RAM 太多了。我想了解在不降低性能的情况下我可以带走多少。

这是否意味着我只需要 8GB,因为这超过了“使用中”的数量?或者在确定需要多少时是否需要包括“缓存”数量?

Bar*_*Vos 5

SQL Server 将保留它分配的 RAM,因此由于它似乎不会超过 6-7 GB,所以我会为 SQL 分配 8GB,并在这种情况下为操作系统保留 2-4 GB(SQL 总是做一些它分配的内存之外的任务sqlserver.exe

最好将此值 (8 GB) 放在 sql server 实例的最小内存设置中。这样,当 SQL 需要内存时,它不会浪费时间首先分配它,因为它在启动时“占用”了 8GB。

在玩 RAM 时,您可以随时检查页面预期寿命。这将告诉您某些内容在 RAM 中停留的时间。这是一个以秒为单位的价值,只要它继续上升,你就是黄金。

SELECT object_name, counter_name, cntr_value
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%Buffer Manager%'
AND [counter_name] = 'Page life expectancy'
Run Code Online (Sandbox Code Playgroud)

只要它保持在300以上,就可以了。较低的值表示存在一定的内存压力。这可能发生在执行大型排序、更新/重建索引、...如果在重新启动实例后此值很低,请不要惊慌,它永远不会大于 SQL 运行的时间。

第二个有趣的计数器是缓冲区缓存命中率,它会告诉您从内存中获取了多少先前的请求(最后几秒)。

SELECT CAST(A.cntr_value1 AS NUMERIC) /
 CAST(B.cntr_value2 AS NUMERIC)* 100 AS Buffer_Cache_Hit_Ratio_Percentage, A.cntr_value1 As Cache_Hits, B.cntr_value2 AS Cache_Lookups
 FROM ( SELECT cntr_value AS cntr_value1
 FROM sys.dm_os_performance_counters
 WHERE object_name = 'MSSQL$SQL01:Buffer Manager' AND counter_name = 'Buffer cache hit ratio'
 ) AS A,
(SELECT cntr_value AS cntr_value2
FROM sys.dm_os_performance_counters
WHERE object_name = 'MSSQL$SQL01:Buffer Manager' AND counter_name = 'Buffer cache hit ratio base'
) AS B;
Run Code Online (Sandbox Code Playgroud)

在此示例中,我的 SQL 实例是一个命名实例SQL01,因此将其更改为您的实例名称或更改MSSQL$SQL01:Buffer Manager为(MSSQLServer:Buffer Manager如果您有默认实例)。

越高越好。在理想情况下,您将在这里获得 100%,这意味着整个数据库都在内存中。