Descubra qual banco de dados no SQL Server 2005 usa quanta RAM

12

Um amigo meu me perguntou hoje (tentando acalmar um cliente agitado) como você poderia descobrir no SQL Server 2005 qual banco de dados usa quanta memória (na RAM do servidor) a qualquer momento.

Isso é sequer possível? Se sim - como? Você pode fazer isso com as ferramentas internas do SQL Server ou precisa de opções extras de terceiros?

Seu cliente ficou todo confuso, porque sua máquina dedicada do SQL Server de repente usa quase 200 KB de seus 4 GB de RAM. Eu não acho que isso seja realmente um problema - mas como esse cara afirma que aconteceu mais ou menos durante a noite, ele quer saber o que causou esse aumento no uso da memória ...

Marc

marc_s
fonte

Respostas:

25

Provavelmente, foi causada por uma consulta que desejava ler mais páginas no buffer pool e o buffer pool capturou mais memória para acomodar isso. É assim que o SQL Server deve funcionar. Se a caixa sofrer pressão de memória, solicitará que o SQL Server desista de um pouco de memória, o que fará. O cliente não deve se preocupar.

Você pode usar a DMV sys.dm_os_buffer_descriptorspara ver quanto da memória do buffer pool está sendo usada por qual banco de dados. Esse trecho informará quantas páginas limpas e sujas (modificadas desde o último ponto de verificação ou lidas do disco) de cada banco de dados estão no buffer pool. Você pode modificar ainda mais.

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'
FROM sys.dm_os_buffer_descriptors
   GROUP BY [database_id], [is_modified]
   ORDER BY [database_id], [is_modified];
GO

Explico isso um pouco mais nesta postagem de blog Por dentro do mecanismo de armazenamento: o que há no buffer pool?

Você também pode fazer o check-out da KB 907877 ( como usar o comando DBCC MEMORYSTATUS para monitorar o uso de memória no SQL Server 2005 ), que lhe dará uma idéia da discriminação do restante do uso de memória do SQL Server (mas não por banco de dados).

Espero que isto ajude!

Paul Randal
fonte
Você é um gênio, Paul!
marc_s
2

Seu amigo também pode limitar a quantidade de RAM que o SQL consumirá, porque, como Paul afirma acima, o SQL consumirá toda a memória possível.

Limite a quantidade de memória consumida pelo SQL Server para 2000 Mb (ou o que você achar melhor).

--Enable advanced options:
USE master
EXEC sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE

--Set the maximum amount of memory to 2000 MB:
USE master
EXEC sp_configure 'max server memory (MB)', 2000
RECONFIGURE WITH OVERRIDE

--Display the newly set configuration:
USE master
EXEC sp_configure 'max server memory (MB)'

--Set 'show advanced options' back to default:
USE master
EXEC sp_configure 'show advanced options', 0 
RECONFIGURE WITH OVERRIDE
Dave
fonte
Obrigado - Eu sabia como limitar a memória, mas não sabia como descobrir qual banco de dados está usando a quantidade de memória do buffer pool em um determinado momento.
marc_s