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:
- Antallet af databaseforbindelser
- Diskplads
- RAM-kapacitet
- 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.