El uso de una instancia de SQL Server para muchos proyectos no es inusual. Sin embargo, definir el proyecto más activo puede ser bastante difícil. Hoy, me gustaría compartir varias formas de analizar la actividad de cada base de datos en particular.
En este artículo, vamos a considerar los siguientes puntos:
- El número de conexiones a la base de datos
- Espacio en disco
- Capacidad de RAM
- La actividad de los archivos de la base de datos durante un período de tiempo determinado
El número de conexiones a la base de datos
Para definir el número de conexiones, utilice 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
Tenga en cuenta que el número de conexiones no muestra la actividad y la carga de la base de datos. Las conexiones pueden estar inactivas o activas.
Espacio en disco
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 consulta devuelve dos filas para cada base de datos. La primera fila es el tamaño de los datos y la segunda es un registro de transacciones.
La suma de archivos de datos y registros devuelve solo una fila para cada base de datos.
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
Capacidad 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 columna Porcentaje de grupo de búfer refleja el porcentaje de consumo de memoria de la capacidad total.
La actividad de los archivos de la base de datos durante un período de tiempo determinado
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
El script recopilará información por minuto de forma predeterminada. Si necesita un informe para un período de tiempo más largo, cambie WAITFOR DELAY '00:01:00'.
El informe devuelve información para cada archivo de base de datos.
Conclusión
Incluso si tiene muchos proyectos en una instancia de SQL Server, aún puede obtener suficiente información sobre cada uno de ellos. Por supuesto, si el proyecto es importante y requiere condiciones especiales para acceder, recomiendo ponerlo en una instancia separada, ya que no podemos ver e implementar todo dentro de una instancia y muchos proyectos.