Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak analizować aktywność jednej bazy danych w SQL Server

Używanie jednej instancji SQL Server dla wielu projektów nie jest niczym niezwykłym. Jednak zdefiniowanie najbardziej aktywnego projektu może być dość trudne. Dzisiaj chciałbym podzielić się kilkoma sposobami analizy aktywności każdej konkretnej bazy danych.

W tym artykule rozważymy następujące punkty:

  1. Liczba połączeń z bazą danych
  2. Miejsce na dysku
  3. Pojemność pamięci RAM
  4. Aktywność plików bazy danych przez określony czas

Liczba połączeń z bazą danych

Aby określić liczbę połączeń, użyj 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

Należy zauważyć, że liczba połączeń nie wyświetla aktywności i obciążenia bazy danych. Połączenia mogą być nieaktywne lub aktywne.

Miejsce na dysku

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

Zapytanie zwraca dwa wiersze dla każdej bazy danych. Pierwszy wiersz to rozmiar danych, a drugi to dziennik transakcji.

Suma plików danych i dzienników zwraca tylko jeden wiersz dla każdej bazy danych.

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

Pojemność pamięci 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];

Kolumna Procent puli buforów odzwierciedla procent wykorzystania pamięci w całkowitej pojemności.

Aktywność plików bazy danych przez określony czas

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

Skrypt będzie domyślnie zbierać informacje na minutę. Jeśli potrzebujesz raportu przez dłuższy czas, zmień OPÓŹNIENIE OCZEKIWANIA '00:001:00′.

Raport zwraca informacje dla każdego pliku bazy danych.

Wniosek

Nawet jeśli masz wiele projektów na jednej instancji SQL Server, nadal możesz uzyskać wystarczającą ilość informacji o każdym z nich. Oczywiście, jeśli projekt jest ważny i wymaga specjalnych warunków dostępu, zdecydowanie zalecam umieszczenie go w osobnej instancji, ponieważ nie możemy zobaczyć i zaimplementować wszystkiego w jednej instancji i wielu projektach.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę używać jednej puli połączeń mssql na kilku trasach w aplikacji internetowej Express 4?

  2. Znajdź jednostki odniesienia w SQL Server:sys.dm_sql_referencing_entities()

  3. Eksportuj dane z SQL Server do Excela i pliku tekstowego za pomocą pakietu SSIS

  4. Konwertuj z DateTime na INT

  5. Co to jest kolumna wyliczana w programie SQL Server?