Skip to content

SQLServer 核心监控指标清单

在SQLServer数据库运维中,监控是确保数据库稳定运行的重要环节。通过监控关键指标,可以及时发现并解决性能问题,预防故障发生。本文将详细介绍SQLServer的核心监控指标,帮助DBA建立完善的监控体系。

监控指标分类

SQLServer的监控指标可以分为以下几类:

  • 资源利用率指标:CPU、内存、磁盘I/O、网络等
  • 数据库性能指标:查询响应时间、吞吐量、并发连接数等
  • 数据库状态指标:数据库可用性、备份状态、索引碎片等
  • 错误和告警指标:错误日志、异常事件、告警信息等

资源利用率指标

1. CPU利用率

监控指标

  • 总体CPU利用率:服务器总体CPU使用率
  • SQLServer进程CPU利用率:SQLServer进程占用的CPU百分比
  • CPU就绪队列长度:CPU等待执行的线程数
  • 上下文切换率:每秒上下文切换次数

监控方法

  • Windows性能监视器:Processor(_Total)% Processor Time
  • SQLServer动态管理视图:sys.dm_os_ring_buffers, sys.dm_os_performance_counters
  • T-SQL查询示例:
    sql
    -- 查询SQLServer进程CPU使用率
    SELECT 
        (total_worker_time - start_time_total_worker_time) / 1000000.0 AS cpu_usage_seconds
    FROM 
        (SELECT 
             SUM(ws.total_worker_time) AS total_worker_time,
             MIN(ws.start_time_total_worker_time) AS start_time_total_worker_time
         FROM 
             (SELECT 
                  SUM(worker_time) OVER () AS total_worker_time,
                  MIN(start_time) OVER () AS start_time_total_worker_time
              FROM 
                  sys.dm_exec_requests
              WHERE 
                  session_id > 50) AS ws) AS t;

阈值建议

  • 总体CPU利用率:持续超过80%需要关注
  • SQLServer进程CPU利用率:持续超过70%需要优化
  • CPU就绪队列长度:超过CPU核心数的2倍需要关注

2. 内存利用率

监控指标

  • SQLServer内存使用量:SQLServer进程占用的内存
  • Buffer Pool命中率:数据页在内存中的命中率
  • 页寿命(Page Life Expectancy):数据页在Buffer Pool中停留的平均时间
  • 内存授予等待(Memory Grant Pending):等待内存授予的请求数
  • 免费内存:服务器剩余可用内存

监控方法

  • Windows性能监视器:Process(sqlservr)\Working Set
  • SQLServer动态管理视图:sys.dm_os_performance_counters, sys.dm_os_memory_clerks
  • T-SQL查询示例:
    sql
    -- 查询Buffer Pool命中率和页寿命
    SELECT 
        (SELECT cntr_value FROM sys.dm_os_performance_counters WHERE counter_name = 'Buffer cache hit ratio') * 1.0 /
        (SELECT cntr_value FROM sys.dm_os_performance_counters WHERE counter_name = 'Buffer cache hit ratio base') * 100 AS buffer_cache_hit_ratio_percent,
        (SELECT cntr_value FROM sys.dm_os_performance_counters WHERE counter_name = 'Page life expectancy') AS page_life_expectancy;

阈值建议

  • SQLServer内存使用量:根据服务器配置和工作负载调整
  • Buffer Pool命中率:应高于95%
  • 页寿命:应高于300秒
  • 内存授予等待:持续大于0需要关注

3. 磁盘I/O指标

监控指标

  • 磁盘读写次数(IOPS):每秒读写操作数
  • 磁盘吞吐量(MBps):每秒读写数据量
  • 平均磁盘读写延迟:磁盘I/O操作的平均响应时间
  • 磁盘队列长度:等待磁盘I/O的请求数
  • SQLServer等待类型:PAGEIOLATCH_*, WRITELOG等I/O相关等待

监控方法

  • Windows性能监视器:PhysicalDisk()\Avg. Disk sec/Read, PhysicalDisk()\Avg. Disk sec/Write
  • SQLServer动态管理视图:sys.dm_io_virtual_file_stats, sys.dm_os_wait_stats
  • T-SQL查询示例:
    sql
    -- 查询数据库文件I/O延迟
    SELECT 
        DB_NAME(database_id) AS database_name,
        file_id,
        CASE WHEN file_id = 2 THEN 'Log' ELSE 'Data' END AS file_type,
        io_stall_read_ms / NULLIF(num_of_reads, 0) AS avg_read_latency_ms,
        io_stall_write_ms / NULLIF(num_of_writes, 0) AS avg_write_latency_ms
    FROM 
        sys.dm_io_virtual_file_stats(NULL, NULL)
    WHERE 
        num_of_reads > 0 OR num_of_writes > 0;

阈值建议

  • 平均磁盘读延迟:应低于10ms
  • 平均磁盘写延迟:应低于20ms
  • 磁盘队列长度:超过磁盘 spindles 数的2倍需要关注
  • I/O相关等待:持续占总等待时间的30%以上需要优化

4. 网络指标

监控指标

  • 网络吞吐量:每秒发送和接收的数据量
  • 网络等待时间:网络I/O等待时间
  • 连接数:当前活跃连接数
  • 连接错误数:每秒连接错误数

监控方法

  • Windows性能监视器:Network Interface(*)\Bytes Total/sec
  • SQLServer动态管理视图:sys.dm_exec_connections, sys.dm_os_performance_counters
  • T-SQL查询示例:
    sql
    -- 查询当前活跃连接数
    SELECT 
        COUNT(*) AS active_connections
    FROM 
        sys.dm_exec_sessions
    WHERE 
        status = 'running' AND session_id > 50;

阈值建议

  • 网络吞吐量:根据网络带宽和业务需求调整
  • 连接数:不超过SQLServer最大连接数的80%
  • 连接错误数:持续大于0需要关注

数据库性能指标

1. 查询性能指标

监控指标

  • 每秒查询数(QPS):每秒执行的查询次数
  • 查询响应时间:查询的平均执行时间
  • 慢查询数量:执行时间超过阈值的查询数
  • 查询计划重用率:查询计划的重用比例
  • 编译/重编译次数:每秒查询编译和重编译次数

监控方法

  • SQLServer动态管理视图:sys.dm_exec_query_stats, sys.dm_exec_procedure_stats
  • Query Store:监控查询性能和执行计划
  • T-SQL查询示例:
    sql
    -- 查询前10个耗时最长的查询
    SELECT TOP 10
        query_hash,
        SUM(total_worker_time) / SUM(execution_count) AS avg_cpu_time,
        SUM(total_elapsed_time) / SUM(execution_count) AS avg_duration,
        SUM(execution_count) AS execution_count,
        MIN(statement_text) AS sample_statement
    FROM 
        (SELECT 
             qs.query_hash,
             qs.total_worker_time,
             qs.total_elapsed_time,
             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) AS t
    GROUP BY 
        query_hash
    ORDER BY 
        avg_duration DESC;

阈值建议

  • 查询响应时间:根据业务需求调整,通常关键查询应低于1秒
  • 慢查询数量:持续增加需要优化
  • 查询计划重用率:应高于90%
  • 编译/重编译次数:占总查询数的比例应低于5%

2. 事务指标

监控指标

  • 每秒事务数(TPS):每秒执行的事务数量
  • 事务响应时间:事务的平均执行时间
  • 长事务数量:执行时间超过阈值的事务数
  • 死锁数量:每秒死锁数
  • 锁等待时间:锁等待的平均时间

监控方法

  • SQLServer动态管理视图:sys.dm_tran_active_transactions, sys.dm_os_performance_counters
  • T-SQL查询示例:
    sql
    -- 查询当前活跃事务
    SELECT 
        dt.transaction_id,
        DB_NAME(dt.database_id) AS database_name,
        dt.transaction_begin_time,
        DATEDIFF(second, dt.transaction_begin_time, GETDATE()) AS transaction_duration_seconds,
        dt.transaction_type,
        dt.transaction_state,
        des.session_id,
        des.login_name,
        des.host_name,
        des.program_name,
        dst.text AS transaction_text
    FROM 
        sys.dm_tran_active_transactions AS dt
    JOIN 
        sys.dm_tran_session_transactions AS dst ON dt.transaction_id = dst.transaction_id
    JOIN 
        sys.dm_exec_sessions AS des ON dst.session_id = des.session_id
    LEFT JOIN 
        sys.dm_exec_connections AS dec ON des.session_id = dec.session_id
    OUTER APPLY 
        sys.dm_exec_sql_text(dec.most_recent_sql_handle) AS dst;

阈值建议

  • 每秒事务数:根据业务需求调整
  • 长事务数量:持续大于0需要关注
  • 死锁数量:持续大于0需要解决
  • 锁等待时间:平均超过100ms需要优化

3. 索引指标

监控指标

  • 索引使用率:索引被使用的频率
  • 索引碎片率:索引碎片的百分比
  • 缺失索引数量:SQLServer建议创建的索引数
  • 索引扫描/查找比例:索引扫描和索引查找的比例

监控方法

  • SQLServer动态管理视图:sys.dm_db_index_usage_stats, sys.dm_db_index_physical_stats
  • T-SQL查询示例:
    sql
    -- 查询索引碎片率超过30%的索引
    SELECT 
        DB_NAME(database_id) AS database_name,
        OBJECT_NAME(object_id, database_id) AS table_name,
        i.name AS index_name,
        ips.avg_fragmentation_in_percent,
        ips.page_count
    FROM 
        sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') AS ips
    JOIN 
        sys.indexes AS i ON ips.object_id = i.object_id AND ips.index_id = i.index_id
    WHERE 
        ips.avg_fragmentation_in_percent > 30 AND ips.page_count > 1000
    ORDER BY 
        ips.avg_fragmentation_in_percent DESC;

阈值建议

  • 索引碎片率:超过30%需要重建,10%-30%需要重组
  • 缺失索引数量:持续增加需要评估是否创建
  • 索引扫描/查找比例:索引扫描占比应低于20%

数据库状态指标

1. 数据库可用性

监控指标

  • 数据库状态:数据库是否在线、可疑、恢复中、离线等
  • 可用性组状态:Always On可用性组的同步状态
  • 复制状态:复制代理的运行状态
  • 镜像状态:数据库镜像的同步状态

监控方法

  • SQLServer动态管理视图:sys.databases, sys.dm_hadr_availability_group_states
  • T-SQL查询示例:
    sql
    -- 查询数据库状态
    SELECT 
        name AS database_name,
        state_desc,
        recovery_model_desc,
        compatibility_level,
        collation_name
    FROM 
        sys.databases;

阈值建议

  • 数据库状态:应为ONLINE
  • 可用性组状态:同步副本应为SYNCHRONIZED

2. 备份状态

监控指标

  • 最后一次备份时间:全量、差异、事务日志备份的最后执行时间
  • 备份成功率:备份作业的成功比例
  • 备份大小:备份文件的大小
  • 备份持续时间:备份作业的执行时间

监控方法

  • SQLServer动态管理视图:sys.dm_db_backup_history
  • SQL Server代理:监控备份作业状态
  • T-SQL查询示例:
    sql
    -- 查询数据库最后一次备份时间
    SELECT 
        d.name AS database_name,
        MAX(CASE WHEN b.type = 'D' THEN b.backup_finish_date END) AS last_full_backup,
        MAX(CASE WHEN b.type = 'I' THEN b.backup_finish_date END) AS last_diff_backup,
        MAX(CASE WHEN b.type = 'L' THEN b.backup_finish_date END) AS last_log_backup
    FROM 
        sys.databases AS d
    LEFT JOIN 
        msdb.dbo.backupset AS b ON d.name = b.database_name
    GROUP BY 
        d.name
    ORDER BY 
        d.name;

阈值建议

  • 全量备份:根据业务需求,通常每天至少一次
  • 差异备份:根据业务需求,通常每6-12小时一次
  • 事务日志备份:根据业务需求,通常每15-60分钟一次

3. 事务日志指标

监控指标

  • 事务日志大小:日志文件的当前大小
  • 事务日志使用率:日志文件的使用比例
  • 日志增长次数:日志文件自动增长次数
  • 日志截断状态:事务日志是否正常截断
  • 日志等待时间:WRITELOG等待时间

监控方法

  • SQLServer动态管理视图:sys.dm_db_log_space_usage, sys.dm_os_performance_counters
  • T-SQL查询示例:
    sql
    -- 查询事务日志使用率
    SELECT 
        DB_NAME(database_id) AS database_name,
        (total_log_size_in_bytes - available_log_space_in_bytes) * 100.0 / total_log_size_in_bytes AS log_usage_percent,
        available_log_space_in_bytes / 1024 / 1024 AS available_log_space_mb,
        total_log_size_in_bytes / 1024 / 1024 AS total_log_size_mb
    FROM 
        sys.dm_db_log_space_usage;

阈值建议

  • 事务日志使用率:持续超过80%需要关注
  • 日志增长次数:持续大于0需要调整日志文件大小
  • 日志截断状态:VLF数量不超过100个

错误和告警指标

1. 错误日志指标

监控指标

  • 错误数量:每秒错误数
  • 严重错误数:严重级别>=16的错误数
  • 致命错误数:严重级别>=20的错误数
  • 警告数量:警告信息数量

监控方法

  • SQLServer错误日志:查看错误和警告信息
  • sys.dm_os_ring_buffers:查看系统健康状态
  • T-SQL查询示例:
    sql
    -- 查询最近的错误日志条目
    EXEC xp_readerrorlog 0, 1, NULL, NULL, NULL, NULL, 'DESC';

阈值建议

  • 严重错误数:持续大于0需要立即处理
  • 致命错误数:任何时候出现都需要立即处理

2. 等待统计指标

监控指标

  • 总等待时间:所有等待类型的总等待时间
  • 主要等待类型:占总等待时间比例最高的等待类型
  • 等待队列长度:每种等待类型的队列长度

监控方法

  • SQLServer动态管理视图:sys.dm_os_wait_stats
  • T-SQL查询示例:
    sql
    -- 查询主要等待类型
    SELECT TOP 10
        wait_type,
        wait_time_ms,
        (wait_time_ms * 100.0) / SUM(wait_time_ms) OVER () AS wait_time_percent,
        waiting_tasks_count
    FROM 
        sys.dm_os_wait_stats
    WHERE 
        wait_type NOT IN ('CLR_SEMAPHORE', 'LAZYWRITER_SLEEP', 'RESOURCE_QUEUE', 'SLEEP_TASK', 'SLEEP_SYSTEMTASK', 'SQLTRACE_BUFFER_FLUSH', 'WAITFOR', 'LOGMGR_QUEUE', 'CHECKPOINT_QUEUE', 'REQUEST_FOR_DEADLOCK_SEARCH', 'XE_TIMER_EVENT', 'BROKER_TO_FLUSH', 'BROKER_TASK_STOP', 'CLR_MANUAL_EVENT', 'CLR_AUTO_EVENT', 'DISPATCHER_QUEUE_SEMAPHORE', 'FT_IFTS_SCHEDULER_IDLE_WAIT', 'XE_DISPATCHER_WAIT', 'XE_DISPATCHER_JOIN')
    ORDER BY 
        wait_time_ms DESC;

阈值建议

  • 主要等待类型:单个等待类型占比超过30%需要优化
  • 等待队列长度:持续大于0需要关注

监控工具推荐

1. 原生监控工具

  • SQL Server Management Studio (SSMS):提供图形化监控界面
  • SQL Server Profiler:捕获和分析SQLServer事件
  • Database Engine Tuning Advisor:分析查询性能并提供优化建议
  • Query Store:监控查询性能和执行计划
  • Extended Events:轻量级事件监控系统
  • Performance Monitor:Windows自带的性能监控工具

2. 第三方监控工具

  • SolarWinds Database Performance Analyzer:全面的数据库性能监控工具
  • PRTG Network Monitor:网络和系统监控工具,支持SQLServer监控
  • Datadog:云原生监控平台,支持SQLServer监控
  • New Relic:应用性能监控工具,支持SQLServer监控
  • AppDynamics:应用性能监控工具,支持SQLServer监控
  • Idera SQL diagnostic manager:专门针对SQLServer的监控工具

版本差异

SQLServer版本监控指标支持特性
2005-2008R2支持基本的性能计数器和DMV,缺少Query Store和Extended Events
2012-2014新增Columnstore索引监控,增强了DMV功能
2016+新增Query Store,增强了Extended Events,支持JSON格式输出
2019+新增Intelligent Query Processing监控,增强了内存优化表监控
Azure SQL DB内置监控和性能建议,支持自动优化
Azure SQL 托管实例支持本地监控工具和Azure监控服务

常见问题(FAQ)

Q1: 如何选择合适的监控指标?

A: 应根据业务需求、数据库规模和性能目标选择监控指标。建议从核心指标开始,逐步扩展到更详细的指标。重点监控与业务直接相关的指标,如查询响应时间、事务数和可用性。

Q2: 监控频率应该如何设置?

A: 监控频率应根据指标的变化频率和业务需求确定:

  • 资源利用率指标:每1-5分钟采集一次
  • 数据库性能指标:每5-15分钟采集一次
  • 数据库状态指标:每15-30分钟采集一次
  • 错误和告警指标:实时监控

Q3: 如何处理监控数据?

A: 监控数据应:

  1. 存储在专门的监控数据库中
  2. 设置合理的数据保留策略
  3. 定期分析趋势和异常
  4. 生成可视化报告
  5. 建立告警机制

Q4: 如何建立有效的告警机制?

A: 建立告警机制时应:

  1. 为关键指标设置合理的阈值
  2. 分级告警(警告、严重、紧急)
  3. 多种告警方式(电子邮件、短信、微信等)
  4. 明确告警负责人和处理流程
  5. 定期审查和调整告警规则

Q5: 监控会对数据库性能产生影响吗?

A: 监控会对数据库性能产生一定影响,但影响程度取决于:

  • 监控工具的类型和配置
  • 监控指标的数量和采集频率
  • 数据库的规模和性能

合理配置监控工具和指标可以将影响降到最低。

Q6: 如何优化监控性能?

A: 可以通过以下方法优化监控性能:

  1. 只监控必要的指标
  2. 调整监控频率,避免过于频繁采集
  3. 使用轻量级监控工具(如Extended Events)
  4. 避免在生产环境使用性能影响较大的监控工具(如SQL Server Profiler)
  5. 将监控数据存储在单独的服务器上

总结

SQLServer核心监控指标是数据库运维的重要组成部分,通过监控这些指标,可以及时发现并解决性能问题,预防故障发生。本文介绍了资源利用率、数据库性能、数据库状态和错误告警四个方面的核心监控指标,包括监控方法、阈值建议和版本差异。

建立完善的监控体系需要:

  1. 选择合适的监控指标和工具
  2. 设置合理的监控频率和阈值
  3. 建立有效的告警机制
  4. 定期分析监控数据和趋势
  5. 根据业务需求和系统变化调整监控策略

通过持续监控和优化,可以确保SQLServer数据库的稳定运行,提高业务系统的可用性和性能。