sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo analizar la actividad de una base de datos en SQL Server

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:

  1. El número de conexiones a la base de datos
  2. Espacio en disco
  3. Capacidad de RAM
  4. 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.