Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да анализирате дейността на една база данни в SQL Server

Използването на един екземпляр на SQL Server за много проекти не е необичайно. Въпреки това, дефинирането на най-активния проект може да бъде доста трудно. Днес бих искал да споделя няколко начина за анализиране на активността на всяка конкретна база данни.

В тази статия ще разгледаме следните точки:

  1. Броят на връзките към базата данни
  2. Дисково пространство
  3. Капацитет на RAM
  4. Активността на файловете на базата данни за определен период от време

Броят на връзките към базата данни

За да определите броя на връзките, използвайте 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

Имайте предвид, че броят на връзките не показва активността и натоварването на базата данни. Връзките могат да бъдат неактивни или активни.

Дисково пространство

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

Заявката връща два реда за всяка база данни. Първият ред е размерът на данните, а вторият е регистър на транзакциите.

Сумата от файлове с данни и регистрационни файлове връща само един ред за всяка база данни.

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

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

Колоната Buffer Pool Percent отразява процента на потребление на памет от общия капацитет.

Активността на файловете на базата данни за определен период от време

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

Скриптът ще събира информация на минута по подразбиране. Ако имате нужда от отчет за по-дълъг период от време, променете WAITFOR DELAY ’00:01:00′.

Отчетът връща информация за всеки файл на базата данни.

Заключение

Дори ако имате много проекти на един екземпляр на SQL Server, все пак можете да получите достатъчно информация за всеки от тях. Разбира се, ако проектът е важен и изисква специални условия за достъп, силно препоръчвам да го поставите в отделна инстанция, тъй като не можем да видим и реализираме всичко в рамките на един екземпляр и много проекти.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ограничения на паметта в SQL Server 2016 SP1

  2. Множество реда до една стойност, разделена със запетая, в Sql Server

  3. Какво е @@MAX_PRECISION в SQL Server?

  4. SQL групиране по месец и година

  5. Какво е SQL Server?