segunda-feira, 20 de agosto de 2012

Quanta memória RAM cada banco de dados está utilizando?

Uma ótima dica do blog do John Samson, vale pra SQL Server 2005 e 2008, logo testarei no 2012. Em vários momentos precisamos saber o uso de memória por banco de dados, seja pra migração, seja para monitorar a performance de escrita em disco. Mas bem, vamos à query:


SELECT
(CASE WHEN ([is_modified] = 1) THEN 'Dirty' ELSE 'Clean' END) AS 'Page State',
(CASE WHEN ([database_id] = 32767) THEN 'Resource Database' ELSE DB_NAME (database_id) END) AS 'Database Name',
COUNT (*) AS 'Page Count',
cast((COUNT (*) * 8) as numeric(10,2))/1024 AS 'MBs used'
FROM sys.dm_os_buffer_descriptors
GROUP BY [database_id], [is_modified]
ORDER BY [database_id], [is_modified]


Então vamos entender os registros acima. O que acontece é que o SQL Server faz uso de memória para o Buffer Pool, que é onde ele mantém uma cópia em memória de dados acessados a partir de consultas feitas anteriormente para que ele não precise acessar o disco/storage caso a consulta seja feita novamente. A consulta acima mostra quão grande é o Buffer Pool para cada banco de dados.

Pages são as unidades de armazenamento de dados do SQL Server, e por padrão tem 8 KBytes. O resultado da coluna Page Reads, que pode ser Dirty ou Clean, diferencia o status dos pages. Existem os que contém dados que estão alinhados com o banco de dados (clean) e os que já foram modificados em memória mas ainda não em disco (dirty). Multiplicando o número de pages por 8Kb e dividindo por 1024 temos o número de MBs alocados por banco.

Hoje o post foi mais curto, mas espero que seja útil e obrigado por visitar o blog! :)

Um comentário:

  1. Muito útil Bona, gostei da maneira como após resolver o problema tu explica detalhadamente o funcionamento da query. Show de bola continua com as dicas =D

    ResponderExcluir