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

Sådan analyseres aktiviteten af ​​en database i SQL Server

Det er ikke usædvanligt at bruge én SQL Server-instans til mange projekter. Det kan dog være ret svært at definere det mest aktive projekt. I dag vil jeg gerne dele flere måder at analysere aktiviteten i hver enkelt database på.

I denne artikel vil vi overveje følgende punkter:

  1. Antallet af databaseforbindelser
  2. Diskplads
  3. RAM-kapacitet
  4. Aktiviteten af ​​databasefilerne i en bestemt periode

Antallet af databaseforbindelser

For at definere antallet af forbindelser skal du bruge 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

Bemærk, at antallet af forbindelser ikke viser databaseaktiviteten og belastningen. Forbindelser kan enten være inaktive eller aktive.

Diskplads

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

Forespørgslen returnerer to rækker for hver database. Den første række er datastørrelse, og den anden er en transaktionslog.

Summen af ​​datafiler og logfiler returnerer kun én række for hver 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

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

Kolonnen Buffer Pool Procent afspejler procentdelen af ​​hukommelsesforbruget af den samlede kapacitet.

Aktiviteten af ​​databasefilerne i en bestemt periode

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

Scriptet vil som standard indsamle information pr. minut. Hvis du har brug for en rapport i længere tid, skal du ændre WAITFOR DELAY ’00:01:00′.

Rapporten returnerer oplysninger for hver databasefil.

Konklusion

Selvom du har mange projekter på én SQL Server-instans, kan du stadig få nok information om hver af dem. Selvfølgelig, hvis projektet er vigtigt og kræver særlige betingelser for at få adgang, anbefaler jeg stærkt at lægge det i en separat instans, da vi ikke kan se og implementere alt inden for en instans og mange projekter.


  1. psql-klient kan være et skakbræt nu...

  2. PostgreSQL tabelvariabel

  3. Tjek om databasen findes i PostgreSQL ved hjælp af shell

  4. Sådan vælger du Top N rækker pr. gruppe i MySQL