Découvrez quelle base de données dans SQL Server 2005 utilise la quantité de RAM

12

Un de mes amis m'a demandé aujourd'hui (en essayant de calmer un de ses clients agités) comment vous pourriez découvrir dans SQL Server 2005 quelle base de données utilise la quantité de mémoire (dans la RAM du serveur qui est) à un moment donné.

Est-ce possible du tout? Si c'est le cas, comment? Pouvez-vous le faire avec les outils SQL Server intégrés, ou avez-vous besoin d'options tierces supplémentaires?

Son client était tout troublé parce que sa machine SQL Server dédiée utilise soudainement tout sauf 200 Ko de ses 4 Go de RAM. Je ne pense pas que ce soit un problème, vraiment - mais comme ce type prétend que cela s'est produit plus ou moins pendant la nuit, il veut savoir ce qui a causé cette augmentation de l'utilisation de la mémoire .....

Marc

marc_s
la source

Réponses:

25

Cela était probablement dû à une requête voulant lire plus de pages dans le pool de mémoire tampon, et le pool de mémoire tampon accaparant plus de mémoire pour s'adapter à cela. C'est ainsi que SQL Server est censé fonctionner. Si la boîte subit une pression mémoire, elle demandera à SQL Server de renoncer à de la mémoire, ce qu'elle fera. Le client ne devrait pas s'inquiéter.

Vous pouvez utiliser le DMV sys.dm_os_buffer_descriptorspour voir la quantité de mémoire du pool de tampons utilisée par quelle base de données. Cet extrait vous indiquera combien de pages propres et sales (modifiées depuis le dernier point de contrôle ou lues sur le disque) de chaque base de données se trouvent dans le pool de mémoire tampon. Vous pouvez encore modifier.

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

J'explique cela un peu plus dans cet article de blog Inside the Storage Engine: Que contient le pool de tampons?

Vous pouvez également extraire KB 907877 ( Comment utiliser la commande DBCC MEMORYSTATUS pour surveiller l'utilisation de la mémoire sur SQL Server 2005 ) qui vous donnera une idée de la répartition du reste de l'utilisation de la mémoire de SQL Server (mais pas par base de données).

J'espère que cela t'aides!

Paul Randal
la source
Tu es un génie, Paul!
marc_s
2

Votre ami peut également limiter la quantité de RAM que SQL prendra car, comme Paul le dit ci-dessus, SQL prendra chaque bit de mémoire qu'il peut.

Limitez la quantité de mémoire prise par SQL Server à 2000 Mo (ou ce que vous pensez être le mieux).

--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
la source
Merci - je savais comment limiter la mémoire, mais je ne savais pas comment déterminer la base de données qui utilise la quantité de mémoire tampon du pool à un moment donné.
marc_s