Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como analisar a atividade de um banco de dados no SQL Server


Usar uma instância do SQL Server para muitos projetos não é incomum. No entanto, definir o projeto mais ativo pode ser bastante difícil. Hoje, gostaria de compartilhar várias maneiras de analisar a atividade de cada banco de dados específico.



Neste artigo, vamos considerar os seguintes pontos:
  1. O número de conexões de banco de dados
  2. Espaço em disco
  3. Capacidade de RAM
  4. A atividade dos arquivos de banco de dados por um determinado período de tempo

O número de conexões de banco de dados


Para definir o número de conexões, use 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

Observe que o número de conexões não exibe a atividade e a carga do banco de dados. As conexões podem estar ociosas ou ativas.

Espaço em 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

A consulta retorna duas linhas para cada banco de dados. A primeira linha é o tamanho dos dados e a segunda é um log de transações.

A soma dos arquivos de dados e logs retorna apenas uma linha para cada banco de dados.
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

Capacidade 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];

A coluna Porcentagem do Buffer Pool reflete a porcentagem de consumo de memória da capacidade total.

A atividade dos arquivos de banco de dados por um determinado período de 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

O script coletará informações por minuto por padrão. Se você precisar de um relatório por um período mais longo, altere WAITFOR DELAY ’00:01:00′.

O relatório retorna informações para cada arquivo de banco de dados.

Conclusão


Mesmo se você tiver muitos projetos em uma instância do SQL Server, ainda poderá obter informações suficientes sobre cada um deles. Claro que, se o projeto for importante e exigir condições especiais de acesso, recomendo fortemente colocá-lo em uma instância separada, pois não podemos ver e implementar tudo dentro de uma instância e muitos projetos.