Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment analyser l'activité d'une base de données dans SQL Server

L'utilisation d'une instance SQL Server pour de nombreux projets n'est pas inhabituelle. Cependant, définir le projet le plus actif peut être assez difficile. Aujourd'hui, je voudrais partager plusieurs façons d'analyser l'activité de chaque base de données particulière.

Dans cet article, nous allons considérer les points suivants :

  1. Le nombre de connexions à la base de données
  2. Espace disque
  3. Capacité de RAM
  4. L'activité des fichiers de la base de données pendant une période donnée

Le nombre de connexions à la base de données

Pour définir le nombre de connexions, utilisez master.dbo.sysprocesses

SELECT DB_NAME(p.dbid) db, COUNT(*) quantity 
FROM master.dbo.sysprocesses p 
WHERE p.spid > 50 
group by DB_NAME(p.dbid) 
ORDER BY 1

Notez que le nombre de connexions n'affiche pas l'activité et la charge de la base de données. Les connexions peuvent être inactives ou actives.

Espace disque

CREATE TABLE #sizingDB (dbname nvarchar(255), type_desc nvarchar(50), size_mb bigint)
 
INSERT INTO #sizingDB
exec sp_msforeachdb @command1 = 'use [?]; 
SELECT DB_NAME(),type_desc, SUM(size)*8/1024 as size FROM sys.database_files 
GROUP BY type_desc'
 
SELECT * FROM  #sizingDB
WHERE dbname NOT IN ('master','msdb','model')
ORDER BY dbname, type_desc DESC
 
DROP TABLE #sizingDB

La requête renvoie deux lignes pour chaque base de données. La première ligne est la taille des données et la seconde est un journal des transactions.

La somme des fichiers de données et des journaux renvoie une seule ligne pour chaque base de données.

select
    db_name(dbid), 
    sum(cast(size as bigint)) * 8 / 1024 as SizeGB,
    sum(case when f.groupid = 0 then 0 else cast(size as bigint) end) * 8 / 1024 as DataSizeMb,
    sum(case when f.groupid != 0 then 0 else cast(size as bigint) end) * 8 / 1024 as LogSizeMb
from master.sys.sysaltfiles as f
group by db_name(dbid)
order by SizeGB desc

Capacité de RAM

WITH AggregateBufferPoolUsage
AS
(SELECT DB_NAME(database_id) AS [Database Name],
CAST(COUNT(*) * 8/1024.0 AS DECIMAL (10,2))  AS [CachedSize]
FROM sys.dm_os_buffer_descriptors WITH (NOLOCK)
WHERE database_id > 4 -- system databases
AND database_id <> 32767 -- ResourceDB
GROUP BY DB_NAME(database_id))
SELECT ROW_NUMBER() OVER(ORDER BY CachedSize DESC) AS [Buffer Pool Rank], [Database Name], CachedSize AS [Cached Size (MB)],
		CAST(CachedSize / SUM(CachedSize) OVER() * 100.0 AS DECIMAL(5,2)) AS [Buffer Pool Percent]
FROM AggregateBufferPoolUsage
ORDER BY [Buffer Pool Rank];

La colonne Pourcentage du pool de mémoire tampon reflète le pourcentage de consommation de mémoire de la capacité totale.

L'activité des fichiers de la base de données pendant une période donnée

SELECT DB_NAME(saf.dbid) AS [db],
	saf.name AS [name],
	vfs.BytesRead/1048576 AS [read],
	vfs.BytesWritten/1048576 AS [write]
	INTO #dbusage
FROM master..sysaltfiles AS saf
JOIN ::fn_virtualfilestats(NULL,NULL) AS vfs ON vfs.dbid = saf.dbid AND
												vfs.fileid = saf.fileid AND
												saf.dbid NOT IN (1,3,4)
WHERE  DB_NAME(saf.dbid) <> 'tempdb'
ORDER BY vfs.BytesRead/1048576 + BytesWritten/1048576 DESC
 
WAITFOR DELAY '00:01:00'
 
SELECT DB_NAME(saf.dbid) AS [db],
	saf.name AS [name],
	vfs.BytesRead/1048576 AS [read],
	vfs.BytesWritten/1048576 AS [write]
	INTO #dbusage2
FROM master..sysaltfiles AS saf
JOIN ::fn_virtualfilestats(NULL,NULL) AS vfs ON vfs.dbid = saf.dbid AND
												vfs.fileid = saf.fileid AND
												saf.dbid NOT IN (1,3,4)
WHERE  DB_NAME(saf.dbid) <> 'tempdb'
ORDER BY vfs.BytesRead/1048576 + BytesWritten/1048576 DESC
 
 
SELECT t.db,t.name,(t2.[read] - t.[read]) as tread,(t2.[write] - t.[write]) as [twrite]	
	FROM #dbusage t INNER JOIN #dbusage2 t2 on t.db= t2.db AND t.name=t2.name
		
DROP TABLE #dbusage
DROP TABLE #dbusage2

Le script collectera des informations par minute par défaut. Si vous avez besoin d'un rapport pour une période plus longue, modifiez WAITFOR DELAY '00:01:00′.

Le rapport renvoie des informations pour chaque fichier de base de données.

Conclusion

Même si vous avez de nombreux projets sur une instance SQL Server, vous pouvez toujours obtenir suffisamment d'informations sur chacun d'eux. Bien sûr, si le projet est important et nécessite des conditions particulières d'accès, je recommande fortement de le mettre dans une instance séparée, car nous ne pouvons pas tout voir et tout mettre en œuvre dans une instance et plusieurs projets.