sql >> Database >  >> RDS >> Sqlserver

Hoe de activiteit van één database in SQL Server te analyseren

Het is niet ongebruikelijk om voor veel projecten één SQL Server-instantie te gebruiken. Het definiëren van het meest actieve project kan echter behoorlijk moeilijk zijn. Vandaag wil ik verschillende manieren delen om de activiteit van elke specifieke database te analyseren.

In dit artikel gaan we de volgende punten bespreken:

  1. Het aantal databaseverbindingen
  2. Schijfruimte
  3. RAM-capaciteit
  4. De activiteit van de databasebestanden voor een bepaalde periode

Het aantal databaseverbindingen

Om het aantal verbindingen te definiëren, gebruikt u 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

Houd er rekening mee dat het aantal verbindingen de database-activiteit en belasting niet weergeeft. Verbindingen kunnen zowel inactief als actief zijn.

Schijfruimte

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

De query retourneert twee rijen voor elke database. De eerste rij is de gegevensgrootte en de tweede is een transactielogboek.

De som van gegevensbestanden en logboeken levert slechts één rij op voor elke 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-capaciteit

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

De kolom Percentage bufferpool geeft het percentage geheugengebruik van de totale capaciteit weer.

De activiteit van de databasebestanden voor een bepaalde 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

Het script verzamelt standaard informatie per minuut. Als u een rapport voor een langere periode nodig heeft, wijzigt u WAITFOR DELAY '00:01:00'.

Het rapport retourneert informatie voor elk databasebestand.

Conclusie

Zelfs als u veel projecten op één SQL Server-instantie hebt, kunt u nog steeds voldoende informatie over elk ervan krijgen. Natuurlijk, als het project belangrijk is en speciale voorwaarden vereist om toegang te krijgen, raad ik je ten zeerste aan om het in een aparte instantie te plaatsen, omdat we niet alles binnen één instantie en veel projecten kunnen zien en implementeren.


  1. Hoe kan ik testen of een kolom in een tabel bestaat met behulp van een SQL-instructie?

  2. Optionele afhankelijkheden creëren

  3. Backticks gebruiken rond veldnamen

  4. Verbindingspooling in .NET/SQL-server?