2025-11-10
SQLSERVER
00

目录

1. CPU使用率
监控脚本示例:
2. 内存使用情况
监控脚本示例:
3. 磁盘I/O
监控脚本示例:
4. 锁定和阻塞
监控脚本示例:
5. 查询性能
监控脚本示例:
结论

在维护和优化SQL Server数据库时,理解关键的性能指标是至关重要的。性能指标能够帮助数据库管理员(DBAs)监控数据库的健康状态,发现潜在的问题,并进行及时的调优。以下是一些SQL Server的关键性能指标及相应的监控脚本。

1. CPU使用率

CPU使用率是衡量服务器处理能力是否饱和的重要指标。高CPU使用率可能意味着查询需要优化,或者服务器硬件需要升级。

监控脚本示例:

SQL
SELECT sqltext.TEXT, req.session_id, req.status, req.command, req.cpu_time, req.total_elapsed_time FROM sys.dm_exec_requests req CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext WHERE req.status = 'running' AND req.cpu_time > 5000 -- 过滤出CPU时间超过5秒的请求 ORDER BY req.cpu_time DESC;

2. 内存使用情况

SQL Server会尽可能多地使用内存来提高查询性能。监控内存使用情况能够帮助DBAs了解是否需要调整内存设置或优化查询来减少内存消耗。

监控脚本示例:

SQL
SELECT object_name, counter_name, cntr_value FROM sys.dm_os_performance_counters WHERE object_name LIKE '%Buffer Manager%' AND (counter_name = 'Page life expectancy' OR counter_name = 'Buffer cache hit ratio' OR counter_name = 'Page reads/sec' OR counter_name = 'Page writes/sec');

image.png

3. 磁盘I/O

磁盘I/O是数据库性能的关键因素。监控磁盘读写延迟和IOPS(每秒输入/输出操作数)可以帮助识别是否存在磁盘性能瓶颈。

监控脚本示例:

SQL
SELECT DB_NAME(vfs.database_id) AS database_name, mf.physical_name, vfs.num_of_reads, vfs.num_of_writes, vfs.io_stall_read_ms, vfs.io_stall_write_ms FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs JOIN sys.master_files AS mf ON vfs.database_id = mf.database_id AND vfs.file_id = mf.file_id ORDER BY vfs.io_stall_write_ms DESC;

image.png

4. 锁定和阻塞

锁定和阻塞是数据库性能问题的常见原因。监控当前的锁定情况和阻塞事件可以帮助DBAs及时解决冲突。

监控脚本示例:

SQL
SELECT t1.resource_type, t1.resource_database_id, t1.resource_associated_entity_id, t1.request_mode, t1.request_session_id, t2.blocking_session_id FROM sys.dm_tran_locks AS t1 INNER JOIN sys.dm_os_waiting_tasks AS t2 ON t1.lock_owner_address = t2.resource_address;

5. 查询性能

长时间运行的查询和消耗资源最多的查询通常是性能问题的源头。DBAs需要定期检查并优化这些查询。

监控脚本示例:

SQL
SELECT TOP 10 qs.total_elapsed_time / qs.execution_count / 1000000.0 AS average_seconds, qs.total_elapsed_time / 1000000.0 AS total_seconds, qs.execution_count, SUBSTRING(st.text, (qs.statement_start_offset / 2) + 1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset) / 2) + 1) AS statement_text FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st ORDER BY average_seconds DESC;

image.png

结论

监控和理解SQL Server的性能指标对于确保数据库稳定运行和高效处理请求至关重要。通过上述脚本,DBAs能够收集关键指标数据,从而进行有效的性能分析和调优。这些脚本只是入门级别的,针对不同的数据库环境和性能问题,可能需要更深入的分析和定制化的监控策略。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!