Tenho o equívoco de que SELECT * FROM sys.dm_os_performance_counters WHERE counter_name LIKE 'Stolen Server Memory%';
mostra quanta memória o sistema operacional está roubando do SQL Server. A verdade, segundo a documentação , é
Especifica a quantidade de memória que o servidor está usando para outras finalidades além das páginas do banco de dados.
que considero significar "a quantidade de memória usada pelo SQL Server (ou seja, não pelo sistema operacional) para qualquer coisa diferente do buffer pool".
Com isso em mente, faz sentido verificar sys.dm_os_performance_counters
se já estou verificando SELECT * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC
? Dado que o buffer pool está sempre no topo da lista (seu servidor estará condenado se não estiver), determinar quanta memória não está sendo usada por ele deve ser uma simples questão de aritmética.
Suspeito que estou errado sobre isso porque esses dois números não correspondem no meu servidor. No entanto, não sei como descobrir o porquê.
-- Total stolen memory.
SELECT top (1) cntr_value
FROM sys.dm_os_performance_counters
WHERE counter_name LIKE 'Stolen Server Memory%'
ORDER BY cntr_value desc;
-- Total memory not in buffer pool.
-- Should be the same as the above but is always less on my machine.
SELECT SUM(pages_kb)
FROM sys.dm_os_memory_clerks
WHERE [Type] <> 'MEMORYCLERK_SQLBUFFERPOOL';
A memória roubada não é apenas toda a memória, exceto o que está no buffer pool. Notavelmente, o cache do plano não seria contado como memória roubada.
Há uma pergunta semelhante aqui com uma explicação sobre o que inclui a memória roubada. Isso também está vinculado a esta questão .
A documentação oficial parece conter poucos detalhes sobre a memória roubada e o que ela inclui. Esta explicação vem de um antigo artigo de suporte .
A memória roubada pode ser útil para monitorar - ela pode destacar que seu buffer pool foi restrito, o que pode fornecer uma explicação para alguns problemas de desempenho. Se você também monitorar sys.dm_os_memory_clerks, poderá descobrir exatamente para onde foi a memória.
por exemplo, uma grande quantidade de memória usada por MEMORYCLERK_SQLQERESERVATIONS indica que a memória está sendo usada por concessões de memória.
DBA Dash , uma ferramenta de monitoramento gratuita e de código aberto que criei, rastreia contadores de desempenho, incluindo páginas roubadas. Ele também mantém um registro histórico de sys.dm_os_memory_clerks. Isso permite voltar no tempo e diagnosticar problemas de desempenho relacionados à memória.