SQL Server 性能指标
本文整理了 SQL Server 数据库常见的性能监控指标,涵盖 CPU、内存、I/O、锁、等待统计及高可用性等相关维度。这些指标有助于 DBA 和开发人员快速定位性能瓶颈。
注意:部分指标名称源自性能计数器(Performance Counters)或动态管理视图(DMV),具体采集方式可能因监控工具而异。
CPU 与网络
| 指标名称 | 指标键值 | 单位 | 描述 |
|---|
| CPU 使用率 | CPU_Utilization | % | SQL Server 进程占用的 CPU 百分比。 |
| 网络读取流量 | Net_Read_Kb | KB | 网络读取数据量。 |
| 网络写入流量 | Net_Write_Kb | KB | 网络写入数据量。 |
缓存与命中率
| 指标名称 | 指标键值 | 单位 | 描述 |
|---|
| 高速缓存命中率 | Cache_Hit_Ratio | % | 通用高速缓存命中率。 |
| 缓冲区缓存命中率 | Buffer_Cache_Hit_Ratio | % | 在缓冲区高速缓存中找到而不需要从磁盘中读取的页的百分比。 |
| 页生命周期预期 | Page_Life_Expectancy | 秒 | 页在缓冲池中停留的预期时间,反映内存压力。 |
线程等待统计 (Wait Stats)
线程等待类型是诊断 SQL Server 性能问题的核心依据。以下为常见等待类型及其含义:
| 指标名称 | 单位 | 描述 |
|---|
ASYNC_NETWORK_IO | ms | 数据库服务等待客户端取走数据的等待时间(通常指客户端处理慢)。 |
CHECKPOINT_QUEUE | ms | 检查点任务队列长度等待。 |
CHKPT | ms | 服务器通知检查点线程启动的次数等待。 |
CXPACKET | ms | 并行查询中,线程等待其他并行线程处理完成(常与并行度设置有关)。 |
IO_COMPLETION | ms | 等待 I/O 操作完成。 |
LATCH_EX | ms | 等待 EX(排他)闩锁。 |
LATCH_SH | ms | 等待 SH(共享)闩锁。 |
LATCH_UP | ms | 等待 UP(更新)闩锁。 |
LCK_M_S | ms | 任务正在等待获取共享锁(Shared Lock)。 |
LCK_M_SCH_M | ms | 任务正在等待获取架构修改锁(Schema Modification Lock)。 |
LCK_M_SCH_S | ms | 任务正在等待获取架构共享锁(Schema Stability Lock)。 |
LCK_M_U | ms | 任务正在等待获取更新锁(Update Lock)。 |
LCK_M_X | ms | 任务正在等待获取排他锁(Exclusive Lock)。 |
LOGBUFFER | ms | 任务等待日志缓冲区的空间以存储日志记录,提示日志设备压力。 |
LOGMGR_QUEUE | ms | 日志写入任务队列长度等待。 |
PAGEIOLATCH_EX | ms | 任务等待 I/O 请求(独占模式)中缓冲区的闩锁,提示 I/O 压力。 |
PAGEIOLATCH_SH | ms | 任务等待 I/O 请求(共享模式)中缓冲区的闩锁,提示 I/O 压力。 |
PAGEIOLATCH_UP | ms | 任务等待 I/O 请求(更新模式)中缓冲区的闩锁,提示 I/O 压力。 |
PAGELATCH_SH | ms | 任务等待不处于 I/O 请求(共享模式)中的缓冲区闩锁,常提示 tempdb 资源争抢。 |
PAGELATCH_UP | ms | 任务等待不处于 I/O 请求(更新模式)中的缓冲区闩锁,常提示 tempdb 资源争抢。 |
RESOURCE_SEMAPHORE | ms | Worker 等待 SQL Server 给予其申请的内存,提示内存压力。 |
SOS_SCHEDULER_YIELD | ms | 该等待与 CPU 有直接关系,任务让出 CPU 时间片,提示 CPU 压力。 |
WRITELOG | ms | 等待日志刷新完成。 |
WRITE_COMPLETION | ms | 等待 I/O 写入完成。 |
磁盘与空间
| 指标名称 | 指标键值 | 单位 | 描述 |
|---|
| 数据空间大小 | Data_Size | MB | 数据文件占用空间大小。 |
| 实例总空间大小 | Instance_Size | MB | 实例总空间大小。 |
| 日志空间大小 | Log_Size | MB | 日志文件占用空间大小。 |
| 其他空间大小 | Other_Size | MB | 其他文件占用空间大小。 |
| 临时空间大小 | Tmp_Size | MB | 实例临时空间大小(通常指 tempdb)。 |
连接与会话
| 指标名称 | 指标键值 | 单位 | 描述 |
|---|
| 登录次数 | Logins | 次/秒 | 每秒启动的登录总数,不包括已入池连接。 |
| 注销次数 | Logout | 次/秒 | 每秒启动的注销操作总数。 |
| 活跃游标 | Active_Cursors | 个 | 当前活跃游标数量。 |
| 活跃临时表 | Active_Temp_Tables | 个 | 当前活跃临时表数量。 |
| 活跃事务 | Active_Transactions | 个 | 当前活跃事务数量。 |
| 活跃会话 | Active_Sessions | 个 | 当前活跃会话数量。 |
| 连接重置 | Connection_Reset | 个/秒 | 每秒从连接池启动的登录总次数。 |
| 总连接数 | Total_Connections | 个 | 当前与 SQL Server 连接的用户数。 |
查询与负载 (QPS/TPS)
| 指标名称 | 指标键值 | 单位 | 描述 |
|---|
| 查询每秒 (QPS) | QPS | 个/秒 | 每秒批处理请求数。 |
| 事务每秒 (TPS) | TPS_Transactions | 个/秒 | 每秒为数据库启动的事务数。 |
| 写事务每秒 | TPS_Transactions_Writes | 个/秒 | 在上一秒钟内写入数据库并提交的事务数。 |
| 全扫描次数 | Full_Scans | 次/秒 | 每秒表和全文索引完全扫描次数。 |
| 转发记录数 | Forwarded_Records/sec | 个/秒 | 每秒通过记录指针提取的记录数(堆表更新常见)。 |
| 索引搜索次数 | Index_Searches/sec | 次/秒 | 每秒索引搜索次数。 |
负载分布 (响应时间直方图)
统计不同响应时间范围内的 SQL 批处理数目,用于分析查询延迟分布。
| 指标键值 | 单位 | 描述 |
|---|
Batches000000ms_000001ms | 个 | 响应时间 >= 0ms & <= 1ms 的 SQL 批处理数目。 |
Batches000001ms_000002ms | 个 | 响应时间 >= 1ms & <= 2ms 的 SQL 批处理数目。 |
Batches000002ms_000005ms | 个 | 响应时间 >= 2ms & <= 5ms 的 SQL 批处理数目。 |
Batches000005ms_000010ms | 个 | 响应时间 >= 5ms & <= 10ms 的 SQL 批处理数目。 |
Batches000010ms_000020ms | 个 | 响应时间 >= 10ms & <= 20ms 的 SQL 批处理数目。 |
Batches000020ms_000050ms | 个 | 响应时间 >= 20ms & <= 50ms 的 SQL 批处理数目。 |
Batches000050ms_000100ms | 个 | 响应时间 >= 50ms & <= 100ms 的 SQL 批处理数目。 |
Batches000100ms_000200ms | 个 | 响应时间 >= 100ms & <= 200ms 的 SQL 批处理数目。 |
Batches000200ms_000500ms | 个 | 响应时间 >= 200ms & <= 500ms 的 SQL 批处理数目。 |
Batches000500ms_001000ms | 个 | 响应时间 >= 500ms & <= 1000ms 的 SQL 批处理数目。 |
Batches001000ms_002000ms | 个 | 响应时间 >= 1000ms & <= 2000ms 的 SQL 批处理数目。 |
Batches002000ms_005000ms | 个 | 响应时间 >= 2000ms & <= 5000ms 的 SQL 批处理数目。 |
Batches005000ms_010000ms | 个 | 响应时间 >= 5000ms & <= 10000ms 的 SQL 批处理数目。 |
Batches010000ms_020000ms | 个 | 响应时间 >= 10000ms & <= 20000ms 的 SQL 批处理数目。 |
Batches020000ms_050000ms | 个 | 响应时间 >= 20000ms & <= 50000ms 的 SQL 批处理数目。 |
Batches050000ms_100000ms | 个 | 响应时间 >= 50000ms & <= 100000ms 的 SQL 批处理数目。 |
Batches100000ms | 个 | 响应时间 >= 100000ms 的 SQL 批处理数目。 |
I/O 性能
| 指标名称 | 指标键值 | 单位 | 描述 |
|---|
| 总 IOPS | IOPS_Total | 个/秒 | 每秒 IO 总个数。 |
| 读 IOPS | IOPS_Read | 个/秒 | 每秒 IO 读取个数。 |
| 写 IOPS | IOPS_Write | 个/秒 | 每秒 IO 写入个数。 |
| 读吞吐量 | IO_Throughput_Read_Kb | KB/秒 | IO 读取吞吐量。 |
| 写吞吐量 | IO_Throughput_Write_kb | KB/秒 | IO 写入吞吐量。 |
| 总吞吐量 | IO_Throughput_Total_Kb | KB/秒 | IO 总吞吐量。 |
| 后台写入页 | Background_Writer_Pages/sec | 个/秒 | 为强制恢复间隔设置而刷新的页数。 |
| 压缩页 | Pages_Compressed/sec | 页/秒 | 每秒使用 PAGE 压缩的数据页数。 |
| 页查找 | Page_Lookups/sec | 个/秒 | 每秒在缓冲池中查找页的次数。 |
| 预读取页 | Readahead_Pages/sec | 个/秒 | 每秒预读取的页数。 |
| 物理页读取 | Page_Reads | 个/秒 | 每秒发生的物理数据库页读取数。 |
| 页拆分 | Page_Splits | 个/秒 | 每秒由于索引页溢出而发生的页拆分数。 |
| 物理页写入 | Page_Writes | 个/秒 | 每秒发出的物理数据库页写入数。 |
内存使用分类
| 指标名称 | 指标键值 | 单位 | 描述 |
|---|
| 连接内存 | Connection_Memory_Kb | KB | 连接消耗的内存大小。 |
| 数据库缓存内存 | Database_Cache_Memory_Kb | KB | 当前正用来缓存数据库页面的内存量。 |
| 空闲内存 | Free_Memory_Kb | KB | 服务器当前未使用的已提交内存量。 |
| 锁内存 | Lock_Memory_Kb | KB | 用于锁管理的动态内存总量。 |
| 优化器内存 | Optimizer_Memory_Kb | KB | 服务器正用于查询优化的动态内存总数。 |
| SQL 缓存内存 | SQL_Cache_Memory_Kb | KB | 指定服务器正用于动态 SQL 缓存的动态内存总数。 |
| 窃取服务器内存 | Stolen_Server_Memory_Kb | KB | 指定服务器当前正用于除数据库页面之外的其他用途的内存量。 |
| 总服务器内存 | Total_Server_Memory_Kb | KB | SQL Server 总内存使用。 |
| 待授予内存 | Memory_Grants_Pending | 次 | 进程等待内存授予总次数。 |
| 内存授予队列等待 | Memory_Grant_Queue_Waits | 个 | 等待内存授予的进程的统计信息。 |
| 线程安全内存对象等待 | Threadsafe_Memory_Objects_Waits | ms | 等待线程安全内存分配器的进程的统计信息。 |
锁与阻塞
| 指标名称 | 指标键值 | 单位 | 描述 |
|---|
| 死锁次数 | Deadlock | 次/秒 | 每秒死锁发生的次数。 |
| 锁超时 | Lock_Timeout | 个/秒 | 每秒超时的锁请求数,包括对 NOWAIT 锁的请求。 |
| 平均闩锁等待时间 | Average_Latch_Wait_Time | ms | 请求闩锁资源的平均等待时间。 |
| 平均锁等待时间 | Average_Lock_Wait_Time | ms | 请求锁资源的平均等待时间。 |
| 锁请求 | Lock_Requests/sec | 次/秒 | 每秒请求的新锁和锁转换次数。 |
| 锁等待 (统计) | Lock_Waits | 个 | 等待锁的进程的统计信息。 |
| 锁等待时间 | Lock_Wait_Time_ms | ms | 锁在最后一秒内的总等待时间。 |
| 锁等待 (请求数) | Lock_Waits | 个/秒 | 每秒调用者等待的锁请求数。 |
| 闩锁等待 | Latch_Waits | 次/秒 | 每秒未能立即授予闩锁请求次数。 |
| 总闩锁等待时间 | Total_Latch_Wait_Time_ms | ms | 上一秒钟内的闩锁请求的总等待时间。 |
| 锁升级 | Table_Lock_Escalations/sec | 次/秒 | 表上的锁升级到 TABLE 或 HoBT 粒度的次数。 |
| 最长事务运行时间 | Longest_Transaction_Running_Time | 秒 | 长的事务启动后运行的时间长度。 |
| 阻塞进程数 | Processes_Blocked | 个 | 当前阻塞的进程数。 |
| 未提交事务数 | Uncommited_Trans | 个 | 未提交的事务数。 |
| 等待 Worker | Wait_for_Worker | 个 | 等待工作线程变得可用的进程相关的统计信息。 |
| 日志写入等待 | Log_Write_Waits | 个 | 等待写入日志缓冲区的进程的统计信息。 |
| 工作空间同步等待 | Workspace_Synchronization_Waits | % | 与同步访问工作空间的进程相关的统计信息。 |
日志与检查点
| 指标名称 | 指标键值 | 单位 | 描述 |
|---|
| 日志缓冲区等待 | Log_Buffer_Waits | 个 | 等待日志缓冲区可用的进程的统计信息。 |
| 日志刷新大小 | Log_Bytes_Flushed/sec | Bytes/秒 | 每秒刷新的日志大小。 |
| 日志缓存读取 | Log_Cache_Reads/sec | 个/秒 | 每秒通过日志管理器缓存执行的读取次数。 |
| 日志刷新次数 | Log_Flushes/sec | 次/秒 | 每秒日志刷新次数。 |
| 日志池请求 | Log_Pool_Requests/sec | 次/秒 | 日志池处理的日志块请求数。 |
| 日志使用百分比 | Percent_Log_Used | % | 日志中已用空间所占的百分比。 |
| 日志刷新等待 | Log_Flush_Waits/sec | 次/秒 | 每秒等待日志刷新的提交数目。 |
| 日志刷新写入时间 | Log_Flush_Write_Time_ms | ms | 执行在最后一秒完成的写入日志刷新信息的时间。 |
| 检查点页数 | Checkpoint | 个/秒 | 每秒刷新所有脏页的检查点或其他刷新到磁盘的页数。 |
| 惰性写入 | Lazy_Writes/sec | 个/秒 | 每秒刷新脏页缓冲区到磁盘的次数。 |
| 日志增长次数 | Log_Growths | 次 | 数据库事务日志增长的总次数。 |
| 日志收缩次数 | Log_Shrinks | 次 | 数据库的日志收缩总数。 |
| 日志截断次数 | Log_Truncations | 次 | 事务日志被截断的次数。 |
执行计划与编译
| 指标名称 | 指标键值 | 单位 | 描述 |
|---|
| 缓存对象使用中 | Cache_Objects_in_Use | 个 | 执行计划缓存中正在被使用对象个数。 |
| 缓存对象总数 | Cache_Object_Counts | 个 | 执行计划缓存存储对象的个数。 |
| 缓存页数 | Cache_Pages | 个 | 执行计划缓存使用的页数据(8KB/page)。 |
| 自动参数化尝试 | AutoParam_Attempts/sec | 次/秒 | 每秒的自动参数化尝试次数。 |
| 自动参数化失败 | Failed_AutoParams/sec | 次/秒 | 每秒自动参数化尝试失败次数。 |
| 强制参数化 | Forced_Parameterizations/sec | 次/秒 | 每秒成功执行的强制参数化次数。 |
| 安全自动参数化 | Safe_AutoParams/sec | 次/秒 | 每秒安全自动参数化尝试次数。 |
| 重编译次数 | Resqlcompilations | 次/秒 | 每秒语句重新编译的次数。 |
| 编译次数 | Sqlcompilations | 次/秒 | 每秒的 SQL 编译次数。 |
| 不安全自动参数化 | Unsafe_AutoParams/sec | 次/秒 | 每秒不安全的自动参数化尝试次数。 |
| 误导计划执行 | Misguided_Plan_Executions/sec | 次/秒 | 每秒执行计划是通过使用计划指南生成的次数。 |
高可用性 (Mirror & AlwaysOn)
说明:数据库镜像 (Database Mirroring) 功能已在较新版本中标记为 deprecated,建议使用 AlwaysOn 可用性组。
| 指标名称 | 指标键值 | 单位 | 描述 |
|---|
| Mirror 相关 | | | |
| 日志接收字节 | Log_Bytes_Received/sec | Bytes/秒 | 每秒收到的字节数。 |
| 重做字节 | Redone_Bytes/sec | Bytes/秒 | 在最后一秒在辅助数据库上重做的日志记录量。 |
| 剩余重做字节 | Redo_Bytes_Remaining | Bytes | 为完成还原阶段而要重做的剩余的日志量。 |
| 日志发送队列 | Log_Send_Queue | KB | 尚未发送到镜像服务器的日志总字节数。 |
| 重做队列 | Redo_Queue | 个 | 次要副本的日志文件中尚未重做的日志记录量。 |
| AlwaysOn 相关 | | | |
| 重做完成预估时间 | AG_Redo_Finish_Time_Secs | 秒 | 辅助副本完成未重做日志的预估时间。 |
| 从副本接收字节 | Bytes_Received_from_Replica/sec | Bytes/秒 | 每秒从远程可用性副本接收的字节数。 |
| 发送到副本字节 | Bytes_Sent_to_Replica/sec | Bytes/秒 | 每秒发送到远程可用性副本的字节数。 |
| 同步延迟 | AG_Sync_Lag_Secs | 秒 | 在同步期间,辅助副本在主副本后的秒数。 |
| 重做队列大小 | AG_Redo_Queue_Size_Kb | KB | 辅助副本的日志文件中尚未重做的日志记录量。 |
| 发送队列大小 | AG_Send_Queue_Size_Kb | KB | 主数据库中尚未发送到辅助数据库的日志记录量。 |
| 日志发送队列 (AG) | Log_Send_Queue | KB | 主数据库的日志文件中尚未发送到次要副本的日志记录量。 |
其他指标
| 指标名称 | 指标键值 | 单位 | 描述 |
|---|
| 备份还原吞吐量 | Backup_Restore_Throughput/sec | Bytes/秒 | 每秒数据库的备份和还原操作的读取/写入吞吐量。 |
| 批量复制行数 | Bulk_Copy_Rows/sec | 行/秒 | 每秒大容量复制的行数。 |
| 批量复制吞吐量 | Bulk_Copy_Throughput/sec | KB/秒 | 每秒大容量复制的数据量。 |
| 版本清理速率 | Version_Cleanup_Rate_Kb/sec | KB/秒 | 从 tempdb 中的快照隔离版本存储区中删除的速率。 |
| 版本生成速率 | Version_Generation_rate_Kb/sec | KB/秒 | 向 tempdb 中的快照隔离版本存储区中添加新行版本的速率。 |
| DBCC 扫描字节 | DBCC_Logical_Scan_Bytes/sec | Bytes/秒 | 每秒数据库控制台命令 (DBCC) 的逻辑读取扫描字节数。 |
| 页 I/O 闩锁等待 | Page_IO_Latch_Waits | 个 | 与页 I/O 闩锁相关的统计信息。 |
| 页闩锁等待 | Page_Latch_Waits | 秒 | 与页闩锁(不包括 I/O 闩锁)相关的统计信息。 |
说明:
- 本文指标适用于 SQL Server 主流版本,但部分高可用性指标(如 Mirror 相关)在新版本中可能不再推荐使用。
- 单位中的
KB、MB、Bytes 已做标准化处理,实际监控中请注意区分大小写及进制(1024 vs 1000)。 - 等待统计(Wait Stats)中的时间单位通常为毫秒 (ms),具体累积值需结合采集间隔计算速率。