Estou tentando entender o gerenciamento de memória do SQL Server. Tenho um Windows Server 2019 em ambiente virtual com 64 GB de RAM. Também tenho o SQL Server 2019 instalado com Max Server Memory 59776 MB. Usando a seguinte consulta, encontrei a lista de todos os funcionários de memória:
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
A soma total de todos os funcionários de memória foi igual a 23523 MB.
Value for MEMORYCLERK_SQLBUFFERPOOL memory clerk is 18387 MB.
Também verifiquei alguns contadores de desempenho:
Total Server Memory (KB) = 32262 MB.
Database Cache Memory (KB) = 18387 MB.
Por favor, corrija-me se alguma das afirmações abaixo estiver errada,
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.
Minha dúvida relacionada a este assunto:
Se o Total Server Memeory (KB) está relacionado à memória do Buffer Pool, então por que seu tamanho (32262 MB) é maior do que o total de memória total dos funcionários (23523 MB), o que representa tanto a Memória Buffer Poll quanto a Memória Non-Buffer Pool?
Não, parte da alocação de memória para o SQL Server 2019 pode ser feita fora da memória máxima do servidor como (eu citaria o Guia de Arquitetura de Gerenciamento de Memória )
Memória para pilhas de thread1, CLR2, arquivos .dll de procedimento estendido, os provedores OLE DB referenciados por consultas distribuídas, objetos de automação referenciados em instruções Transact-SQL e qualquer memória alocada por uma DLL não SQL Server não são controladas pela memória máxima do servidor.
Assim, você pode ver que parte da memória está alocada fora da memória máxima do servidor, de modo que sua equação nem sempre é verdadeira.
Sim, essa é a memória confirmada usando o gerenciador de memória.
Não, o buffer pool é muito maior, o cache de dados é um subconjunto dele.
A memória total do servidor inclui basicamente a memória usada pelo SQL Server que é quase 31 GB e isso será maior que a soma dos funcionários, que é basicamente 22 GB, porque os funcionários de memória não capturam todas as alocações de memória dentro do SQL Server ( eles fazem a maior parte Contudo).
Diga-me se tiver mais perguntas.