Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come analizzare l'attività di un database in SQL Server

L'utilizzo di un'istanza di SQL Server per molti progetti non è insolito. Tuttavia, definire il progetto più attivo può essere abbastanza difficile. Oggi vorrei condividere diversi modi per analizzare l'attività di ogni particolare database.

In questo articolo considereremo i seguenti punti:

  1. Il numero di connessioni al database
  2. Spazio su disco
  3. Capacità RAM
  4. L'attività dei file di database per un determinato periodo di tempo

Il numero di connessioni al database

Per definire il numero di connessioni, utilizza 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

Si noti che il numero di connessioni non mostra l'attività e il carico del database. Le connessioni possono essere inattive o attive.

Spazio su 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 query restituisce due righe per ogni database. La prima riga è la dimensione dei dati e la seconda è un registro delle transazioni.

La somma dei file di dati e dei registri restituisce solo una riga per ogni database.

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à 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 colonna Percentuale pool di buffer riflette la percentuale di consumo di memoria rispetto alla capacità totale.

L'attività dei file di database per un determinato periodo di tempo

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

Lo script raccoglierà informazioni al minuto per impostazione predefinita. Se hai bisogno di un rapporto per un periodo di tempo più lungo, cambia WAITFOR DELAY '00:01:00′.

Il rapporto restituisce informazioni per ogni file di database.

Conclusione

Anche se hai molti progetti in un'istanza di SQL Server, puoi comunque ottenere informazioni sufficienti su ciascuno di essi. Naturalmente, se il progetto è importante e richiede condizioni speciali per l'accesso, consiglio vivamente di inserirlo in un'istanza separata, poiché non possiamo vedere e implementare tutto all'interno di un'istanza e molti progetti.