sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man analyserar aktiviteten i en databas i SQL Server

Att använda en SQL Server-instans för många projekt är inte ovanligt. Det kan dock vara ganska svårt att definiera det mest aktiva projektet. Idag skulle jag vilja dela med mig av flera sätt att analysera aktiviteten i varje enskild databas.

I den här artikeln kommer vi att överväga följande punkter:

  1. Antalet databasanslutningar
  2. Diskutrymme
  3. RAM-kapacitet
  4. Aktiviteten i databasfilerna under en viss tidsperiod

Antalet databasanslutningar

För att definiera antalet anslutningar, använd 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

Observera att antalet anslutningar inte visar databasaktivitet och laddning. Anslutningar kan vara antingen inaktiva eller aktiva.

Diskutrymme

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

Frågan returnerar två rader för varje databas. Den första raden är datastorlek och den andra är en transaktionslogg.

Summan av datafiler och loggar returnerar endast en rad för varje databas.

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

RAM-kapacitet

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

Kolumnen Buffer Pool Procent återspeglar den procentuella minnesförbrukningen av den totala kapaciteten.

Aktiviteten i databasfilerna under en viss tidsperiod

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

Skriptet samlar in information per minut som standard. Om du behöver en rapport under en längre tid, ändra WAITFOR DELAY ’00:01:00′.

Rapporten returnerar information för varje databasfil.

Slutsats

Även om du har många projekt på en SQL Server-instans kan du fortfarande få tillräckligt med information om var och en av dem. Naturligtvis, om projektet är viktigt och kräver särskilda villkor för att få tillgång, rekommenderar jag starkt att du lägger det i en separat instans, eftersom vi inte kan se och implementera allt inom en instans och många projekt.


  1. Matchar alla värden i IN-satsen

  2. Hekaton med en twist:In-memory TVPs – Del 1

  3. Hur kan man representera arv i en databas?

  4. JDBC-teckenkodning