Eu gostaria de sua opinião sobre isso. Eu tenho um servidor SQL 2008r2 Ent. Ed. 64 bits com 16 núcleos e 64 GB de RAM. Há uma instância do servidor SQL corrigida totalmente a partir de 20111014.
A RAM máxima está definida para 60000 MB. A quantidade de RAM livre é 0 de acordo com o gerenciador de tarefas após alguns dias online.
Se eu alterar o máximo de RAM para menos de 53 GB, depois de alguns dias ele se estabilizará e terá um pouco de RAM livre.
É o processo sql que aloca a memória RAM de acordo com o gerenciador de tarefas. Como faço para chegar a um acordo com o que o problema realmente é? Escusado será dizer que já fiz muitos testes, mas ainda não resolvi isso ao meu gosto. e, ohh, não obtemos o atraso típico de falta de memória quando a memória RAM disponível está livre para 0.
Atualização 1:
Inspirado por outro Q/A relacionado à RAM nesta página https://dba.stackexchange.com/a/7062/2744 . Eu usei esses dois para ver para que a RAM está sendo usada.
SELECT TOP ( 10 )
[type] AS [Memory Clerk Type] ,
SUM(single_pages_kb) AS [SPA Mem, Kb]
FROM sys.dm_os_memory_clerks
GROUP BY [type]
ORDER BY SUM(single_pages_kb) DESC
OPTION ( RECOMPILE ) ;
SELECT DB_NAME(database_id) AS [Database Name] ,
COUNT(*) * 8 / 1024.0 AS [Cached Size (MB)]
FROM sys.dm_os_buffer_descriptors
--WHERE database_id > 4 -- system databases
-- AND database_id <> 32767 -- ResourceDB
GROUP BY DB_NAME(database_id)
ORDER BY [Cached Size (MB)] DESC
OPTION ( RECOMPILE ) ;
A quantidade usada mostrada por eles é primeiro selecionar 7948432 Kb, segundo um 44030,57812 MB, que é um total de cerca de 52 GB usado pelo servidor SQL ... então, para onde foi o resto da minha RAM? :-) O gerenciador de tarefas mostra agora em cache 363, disponível 401, livre 40 e sqlservr.exe tem memória privada definida 64 459 656. Max Ram definido como 60000 MB como antes.
A configuração de memória máxima do SQL Server define os limites apenas para o uso do buffer pool. Haverá alocações variáveis, mas significativas, necessárias além desse limite.
Jonathan Kehayias , Christian Bolton e John Samson têm postagens de nível 300/400 sobre o assunto. Brent Ozar tem um artigo mais fácil de ler que pode ser um lugar melhor para começar.
Também relacionado: SQL Server 2008 R2 “Ghost Memory”
Como dito, o buffer pool e o cache de procedimento são as únicas coisas controladas pela memória máxima do servidor. Existem muitas outras coisas no SQL Server que podem consumir memória além desse limite. Eles incluem (mas não estão limitados a):
Do SQL 2012 em diante, single_pages_kb foi substituído por pages_kb nesse DMV. https://msdn.microsoft.com/en-us/library/ms175019.aspx?f=255&MSPPError=-2147217396
Portanto, se você deseja executar a consulta incluída na pergunta, em um servidor 2012+, remova a string single_.
http://msdn.microsoft.com/en-us/library/ms178067.aspx
Para reduzir a memória máxima do servidor, talvez seja necessário reiniciar o SQL Server para liberar a memória.
Meu entendimento é que, se uma página no pool de buffers não foi gravada no disco, ela não será liberada até que seja.
A redução da configuração de memória máxima faz com que o SQL Server elimine páginas sujas?
Ele poderia monitorar o gerenciador de buffer no perfmon para verificar isso. Perfmon -> SQLServer:Buffer Manager: páginas de banco de dados