SQLSERVER性能计数器是SQL Server内置的一组用于监控数据库实例运行状态的指标集合,覆盖了CPU、内存、磁盘IO、查询执行、锁等多个维度的运行数据,是排查数据库性能问题的重要工具。

SQLSERVER性能计数器的获取方式
获取SQLSERVER性能计数器主要有两种方式,一种是通过系统动态管理视图查询,另一种是通过Windows性能监视器查看。
通过动态管理视图查询
SQL Server提供了sys.dm_os_performance_counters动态管理视图,可以直接查询所有性能计数器的当前值,这种方式适合在数据库内部做自动化监控或者自定义查询。
以下是查询所有性能计数器的基础示例:
-- 查询所有性能计数器
SELECT
object_name AS 计数器对象,
counter_name AS 计数器名称,
instance_name AS 实例名称,
cntr_value AS 计数器值,
cntr_type AS 计数器类型
FROM sys.dm_os_performance_counters
ORDER BY object_name, counter_name;
通过Windows性能监视器查看
打开Windows性能监视器,添加SQL Server相关的计数器对象即可实时查看指标变化,适合做临时的可视化监控,操作路径为:运行perfmon命令,在性能监视器中点击添加计数器,选择SQL Server相关的对象即可。
核心性能计数器分类及含义
SQLSERVER性能计数器按照功能可以分为多个类别,以下是运维中最常用的几类核心计数器。
CPU相关计数器
- SQLServer:SQL StatisticsBatch Requests/sec:每秒处理的批处理请求数,反映数据库的吞吐量,数值越高说明数据库处理的请求越多。
- SQLServer:SQL StatisticsSQL Compilations/sec:每秒的SQL编译次数,如果数值过高说明有大量未参数化的查询,会导致CPU消耗增加。
- SQLServer:SQL StatisticsSQL Re-Compilations/sec:每秒的SQL重编译次数,重编译会消耗额外CPU资源,数值过高需要检查查询语句或者表结构变更频率。
内存相关计数器
- SQLServer:Memory ManagerTotal Server Memory (KB):SQL Server当前使用的内存总量,反映数据库占用的内存大小。
- SQLServer:Memory ManagerTarget Server Memory (KB):SQL Server理想情况下需要的内存总量,如果Total小于Target说明内存不足。
- SQLServer:Buffer ManagerBuffer Cache Hit Ratio:缓冲池命中率,正常值应该在95%以上,低于这个值说明大量数据需要从磁盘读取,内存不足或者查询没有合理使用索引。
磁盘IO相关计数器
- SQLServer:Buffer ManagerPage Reads/sec:每秒从磁盘读取的页数,数值过高说明内存不足或者查询需要扫描大量数据。
- SQLServer:Buffer ManagerPage Writes/sec:每秒写入磁盘的页数,数值过高说明脏页过多,可能是检查点频率或者写入量过大。
- SQLServer:DatabasesLog Flush Waits/sec:每秒日志刷新等待次数,数值过高说明磁盘写入性能不足,影响事务提交速度。
锁和阻塞相关计数器
- SQLServer:LocksLock Wait Time (ms):锁等待的总时间,数值过高说明存在大量阻塞,需要排查阻塞的会话和查询。
- SQLServer:LocksNumber of Deadlocks/sec:每秒发生的死锁数量,正常应该为0,出现死锁需要检查事务逻辑和索引设计。
- SQLServer:General StatisticsProcesses Blocked:当前被阻塞的进程数量,数值大于0说明存在阻塞问题。
用性能计数器排查常见性能问题
排查CPU占用过高问题
如果服务器CPU占用持续过高,可以先查看Batch Requests/sec是否异常升高,同时查看SQL Compilations/sec和SQL Re-Compilations/sec的数值。如果编译次数过高,说明存在大量未参数化的查询,可以通过开启强制参数化或者修改查询语句添加参数来解决。如果编译次数正常但批处理请求数过高,需要排查是否有慢查询消耗大量CPU,结合查询存储或者动态管理视图找到高CPU消耗的查询进行优化。
排查内存不足问题
查看Buffer Cache Hit Ratio是否低于95%,同时对比Total Server Memory和Target Server Memory,如果Total远小于Target,说明SQL Server需要更多内存但无法分配到。此时可以检查服务器的内存配置,是否给SQL Server分配了足够的最大内存,或者是否有其他进程占用了过多内存。如果命中率正常但Page Reads/sec过高,说明查询没有合理使用索引,导致大量数据需要从磁盘读取,需要优化查询索引。
排查阻塞和死锁问题
如果应用反馈操作响应慢,先查看Processes Blocked是否大于0,同时查看Lock Wait Time的数值。如果存在阻塞,可以通过sys.dm_exec_requests和sys.dm_tran_locks找到阻塞的源头会话,检查对应的查询是否没有提交事务或者锁粒度过大。如果Number of Deadlocks/sec大于0,需要开启死锁跟踪,获取死锁的详细信息,调整事务的执行顺序或者添加合适的索引减少锁冲突。
性能计数器使用注意事项
性能计数器的数值需要结合业务场景分析,不能单独看某一个数值的高低。比如Batch Requests/sec在业务高峰期升高是正常情况,只有在无业务增长的情况下突然升高才需要排查。另外计数器是实时或者累计值,部分计数器需要计算差值才能得到每秒的变化量,比如Page Reads/sec可以通过两次查询的差值除以时间间隔得到实际的每秒读取页数。日常运维中可以将核心计数器纳入监控体系,设置合理的阈值告警,提前发现性能隐患。
SQLSERVER性能计数器数据库优化sys_dm_os_performance_counters修改时间:2026-07-07 14:21:34