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 :
- Le nombre de connexions à la base de données
- Espace disque
- Capacité de RAM
- 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.