Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So analysieren Sie die Aktivität einer Datenbank in SQL Server

Die Verwendung einer SQL Server-Instanz für viele Projekte ist nicht ungewöhnlich. Es kann jedoch ziemlich schwierig sein, das aktivste Projekt zu definieren. Heute möchte ich Ihnen verschiedene Möglichkeiten vorstellen, die Aktivität jeder einzelnen Datenbank zu analysieren.

In diesem Artikel werden wir die folgenden Punkte berücksichtigen:

  1. Die Anzahl der Datenbankverbindungen
  2. Speicherplatz
  3. RAM-Kapazität
  4. Die Aktivität der Datenbankdateien für einen bestimmten Zeitraum

Die Anzahl der Datenbankverbindungen

Um die Anzahl der Verbindungen zu definieren, verwenden Sie 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

Beachten Sie, dass die Anzahl der Verbindungen nicht die Datenbankaktivität und -last anzeigt. Verbindungen können entweder im Leerlauf oder aktiv sein.

Speicherplatz

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

Die Abfrage gibt zwei Zeilen für jede Datenbank zurück. Die erste Zeile ist die Datengröße und die zweite ein Transaktionsprotokoll.

Die Summe der Datendateien und Protokolle gibt nur eine Zeile für jede Datenbank zurück.

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-Kapazität

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

Die Spalte Buffer Pool Percent gibt den Prozentsatz des Speicherverbrauchs an der Gesamtkapazität wieder.

Die Aktivität der Datenbankdateien für einen bestimmten Zeitraum

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

Das Skript sammelt standardmäßig Informationen pro Minute. Wenn Sie einen Bericht über einen längeren Zeitraum benötigen, ändern Sie WAITFOR DELAY ’00:01:00′.

Der Bericht gibt Informationen für jede Datenbankdatei zurück.

Schlussfolgerung

Selbst wenn Sie viele Projekte auf einer SQL Server-Instanz haben, können Sie immer noch genügend Informationen zu jedem von ihnen erhalten. Wenn das Projekt wichtig ist und besondere Bedingungen für den Zugriff erfordert, empfehle ich natürlich dringend, es in einer separaten Instanz abzulegen, da wir nicht alles in einer Instanz und vielen Projekten sehen und implementieren können.