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:
- Il numero di connessioni al database
- Spazio su disco
- Capacità RAM
- 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.