Použití jedné instance SQL Server pro mnoho projektů není neobvyklé. Definovat nejaktivnější projekt však může být docela obtížné. Dnes bych se rád podělil o několik způsobů, jak analyzovat aktivitu každé konkrétní databáze.
V tomto článku se budeme zabývat následujícími body:
- Počet databázových připojení
- Místo na disku
- Kapacita RAM
- Aktivita databázových souborů za určité časové období
Počet databázových připojení
Chcete-li definovat počet připojení, použijte 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
Všimněte si, že počet připojení nezobrazuje aktivitu a zatížení databáze. Připojení mohou být nečinná nebo aktivní.
Místo na disku
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
Dotaz vrací dva řádky pro každou databázi. První řádek je velikost dat a druhý je protokol transakcí.
Součet datových souborů a protokolů vrátí pouze jeden řádek pro každou databázi.
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
Kapacita RAM
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];
Sloupec Procento fondu vyrovnávací paměti odráží procento spotřeby paměti z celkové kapacity.
Aktivita databázových souborů za určité časové období
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
Skript bude ve výchozím nastavení shromažďovat informace za minutu. Pokud potřebujete zprávu na delší dobu, změňte WAITFOR DELAY ’00:01:00′.
Sestava vrací informace pro každý databázový soubor.
Závěr
I když máte mnoho projektů na jedné instanci SQL Serveru, stále můžete získat dostatek informací o každém z nich. Samozřejmě, pokud je projekt důležitý a vyžaduje zvláštní podmínky pro přístup, důrazně doporučuji umístit jej do samostatné instance, protože nemůžeme vidět a implementovat vše v rámci jedné instance a mnoha projektů.