我正在尝试了解 SQL Server 的内存管理。我在具有 64 GB RAM 的虚拟环境中有一个 Windows Server 2019。我还安装了最大服务器内存 59776 MB 的 SQL Server 2019。通过使用以下查询,我找到了所有内存管理员的列表:
SELECT [type] AS [ClerkType], SUM(pages_kb) / 1024 AS [SizeMb]
FROM sys.dm_os_memory_clerks WITH (NOLOCK)
GROUP BY [type]
ORDER BY SUM(pages_kb) DESC
所有内存职员的总和等于 23523 MB。
Value for MEMORYCLERK_SQLBUFFERPOOL memory clerk is 18387 MB.
我还检查了一些性能计数器:
Total Server Memory (KB) = 32262 MB.
Database Cache Memory (KB) = 18387 MB.
如果以下任何陈述有误,请纠正我,
Max Server Memory for SQL Server 2019 = Buffer Pool Memory + Non-Buffer Pool Memory.
Total Server Memory (KB) - The committed memory from the Buffer Pool.
Data Cache Memory (KB) performance counter is equivalent to MEMORYCLERK_SQLBUFFERPOOL memory clerk and both represents data cache used size.
Above query shows all memory clerks for both Buffer Pool Memory and Non-Buffer Pool Memory.
我的问题与这个主题有关:
如果 Total Server Memeory (KB) 与 Buffer Pool 内存有关,那么为什么它的大小 (32262 MB) 大于代表 Buffer Poll Memory 和 Non-Buffer Pool Memory 的 Total sum memory clerks (23523 MB)?
不,SQL Server 2019 的某些内存分配可以在最大服务器内存之外完成,例如(我会引用内存管理架构指南)
线程堆栈1、CLR2、扩展过程 .dll 文件、分布式查询引用的 OLE DB 提供程序、Transact-SQL 语句中引用的自动化对象以及非 SQL Server DLL 分配的任何内存都不受最大服务器内存控制。
所以你可以看到内存的一部分分配在最大服务器内存之外,所以你的等式并不总是成立。
是的,这是使用内存管理器提交的内存。
不,缓冲池更大,数据缓存是它的子集。
服务器总内存基本上包括 SQL Server 使用的内存,几乎是 31 GB,这将大于职员的总和,基本上是 22 GB,因为内存职员不会捕获SQL Server 中的所有内存分配(他们做了大部分)然而)。
如果您还有其他问题,请告诉我。