Som*_*Guy 1 sql-server-2005 sql-server memory windows-server
我有一台带有以下内容的 SQL Server 机器:
我将最大服务器内存使用量设置为我认为可接受的值(合计约 10GB,为 Windows 留出 2GB)。我使用以下查询来显示缓冲池和非缓冲池的总 RAM 使用量。我还展示了 MAX SERVER MEMORY 设置。每个实例上的数据库都比分配的 RAM 大得多,即使有几个实例比其他实例得到了更多的使用。实际使用的内存不应该总是非常接近 MAX SERVER MEMORY 设置吗?我发现了一个让我好奇的差距。
DECLARE @TotalRam as decimal (10,2)
--NON-BUFFER POOL
SET @TotalRam = (SELECT sum(pages_allocated_count)/128.0 [Non-Buffer (MB)]
from sys.dm_os_memory_cache_entries
where pages_allocated_count > 0)
--BUFFER POOL
SET @TotalRam = @TotalRam + (
SELECT CAST(COUNT(*) * 8/1024.0 AS DECIMAL (10,2)) AS [Buffer Pool (MB)]
FROM sys.dm_os_buffer_descriptors WITH (NOLOCK)
WHERE database_id > 4 AND database_id <> 32767 )
SELECT @TotalRam as RAMinUSE, value as MaxServerMemory
FROM sys.configurations
WHERE name like '%max server memory%'
Run Code Online (Sandbox Code Playgroud)
查询结果:
我想为这两个重型实例为这台机器增加 12GB 的 RAM,我想确保它会被使用并且我没有配置错误的东西。我已经验证安装的 SQL 和 Windows 版本将支持 24GB RAM。
看到这些值之间存在差距是否正常?也许我的查询遗漏了一些东西。
你们看到从 12GB 到 24GB RAM 的任何问题吗?
此外,PerfMon 中剩余的可用 MBytes 显示大约 600MB。那个数字一定是根据分配了MAX SERVER MEMORY后剩下的多少吧?否则,我希望看到更高的价格。
在您实际将数据加载到内存之前,实际使用的内存不会增加。它不会跳到 10GB 的组合分配,仅仅因为这是您设置的最大内存,并且因为您的数据库至少有那么大。这是一个最大值,而不是一个最小值(不要介意 min 也不能那样工作),并且它不会尝试猜测 - 在你运行足够多的查询之前 - 它应该将哪些表/索引加载到缓冲区中池内存。
所以是的,看到这些值之间的差距是正常的。如果您通过SELECT * FROM dbo.BiggestTables;
在每个实例上发出一堆来泵送缓冲池,您可能会更接近最大值,但通常最好让 SQL Server 根据您的实际应用程序的实际使用情况分配它认为合适的内存。还要记住,最大服务器内存不仅仅涵盖缓冲池。
简而言之,SQL Server 非常擅长内存管理;让它做它的事情,并担心在遇到实际性能问题时调整各种实例的最大内存。