Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách phân tích hoạt động của một cơ sở dữ liệu trong SQL Server

Việc sử dụng một phiên bản SQL Server cho nhiều dự án không phải là điều bất thường. Tuy nhiên, việc xác định dự án tích cực nhất có thể khá khó khăn. Hôm nay, tôi muốn chia sẻ một số cách để phân tích hoạt động của từng cơ sở dữ liệu cụ thể.

Trong bài viết này, chúng ta sẽ xem xét các điểm sau:

  1. Số lượng kết nối cơ sở dữ liệu
  2. Dung lượng đĩa
  3. Dung lượng RAM
  4. Hoạt động của các tệp cơ sở dữ liệu trong một khoảng thời gian cụ thể

Số lượng kết nối cơ sở dữ liệu

Để xác định số lượng kết nối, hãy sử dụng 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

Lưu ý rằng số lượng kết nối không hiển thị hoạt động và tải của cơ sở dữ liệu. Các kết nối có thể không hoạt động hoặc đang hoạt động.

Dung lượng đĩa

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

Truy vấn trả về hai hàng cho mỗi cơ sở dữ liệu. Hàng đầu tiên là kích thước dữ liệu và hàng thứ hai là nhật ký giao dịch.

Tổng các tệp dữ liệu và nhật ký chỉ trả về một hàng cho mỗi cơ sở dữ liệu.

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

Dung lượng 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];

Cột Phần trăm nhóm bộ đệm phản ánh phần trăm tiêu thụ bộ nhớ trong tổng dung lượng.

Hoạt động của các tệp cơ sở dữ liệu trong một khoảng thời gian cụ thể

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

Kịch bản sẽ thu thập thông tin mỗi phút theo mặc định. Nếu bạn cần báo cáo trong một khoảng thời gian dài hơn, hãy thay đổi CHỜ TRÌ HOÃN ’00:01:00 ′.

Báo cáo trả về thông tin cho từng tệp cơ sở dữ liệu.

Kết luận

Ngay cả khi bạn có nhiều dự án trên một phiên bản SQL Server, bạn vẫn có thể nhận đủ thông tin về từng dự án. Tất nhiên, nếu dự án quan trọng và yêu cầu các điều kiện đặc biệt để truy cập, tôi thực sự khuyên bạn nên đặt nó vào một phiên bản riêng biệt, vì chúng tôi không thể xem và triển khai mọi thứ trong một phiên bản và nhiều dự án.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Danh sách phân cấp các loại sự kiện kích hoạt trong SQL Server 2017

  2. Lỗi MSSQL 'Nhà cung cấp cơ bản không thành công khi Mở'

  3. Cách tạo cơ sở dữ liệu trong SQL Server

  4. SQL Server FOR XML Path tạo các nút lặp lại

  5. Cách ánh xạ nhiều phân vùng thành một nhóm tệp trong SQL Server (T-SQL)