8.1 监控工具与 DMV 实战:先学会看见


8.1 监控工具与 DMV 实战:先学会看见

本节摘要:排错的第一能力不是"改",而是"看见"。本节把 SQL Server 的观测工具分成三格:动态管理视图看引擎内部账本、扩展事件做低开销定向采集、性能计数器看操作系统宏观面。重点是给出一套可直接落地的日常取证查询包,并讲清三套工具如何按问题类型分工。

工具箱里先分三格

三格工具的观测层次不同,选错工具等于用错倍率的镜子。**动态管理视图(DMV)**是引擎自曝的账本:等待、会话、请求、计划统计、索引使用、缓冲池分布,全是实例启动以来的累计或实时快照——查"现在"与"最近"用它,几乎零配置。扩展事件是定向行车记录仪:按事件定义采集(语句完成、锁超时、死锁图、页拆分、文件增长),过滤条件精确到数据库与会话,开销极低,适合"我要盯着某个具体行为"的场景。性能计数器是操作系统宏观仪表盘:CPU、磁盘队列、网络、缓冲池命中率、页面预期寿命,跨进程跨层次,适合画趋势线与容量规划。一句话分工:找现在的问题用 DMV,盯特定行为用扩展事件,看趋势做规划用计数器

-- 取证查询包一:等待统计总账(分诊入口,累计口径) SELECT wait_type AS 等待类型, wait_time_ms / 1000 AS 累计等待秒, waiting_tasks_count AS 等待次数 FROM sys.dm_os_wait_stats WHERE wait_type NOT IN ( N'BROKER_TASK_STOP', N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP', N'DIRTY_PAGE_POLL', N'HADR_FILESTREAM_IOMGR_IOCOMPLETION', N'XE_TIMER_EVENT', N'WAITFOR') -- 剔除系统噪声等待 AND wait_time_ms > 1000000 ORDER BY wait_time_ms DESC; -- 读法:剔噪后前五名决定分诊方向;不看这张表就动手,是误诊之源。
-- 取证查询包二:此刻谁在烧资源 SELECT r.session_id, r.status, r.wait_type, r.wait_time, r.cpu_time, r.logical_reads, DB_NAME(r.database_id) AS 库名, t.text AS 当前语句 FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t WHERE r.session_id <> @@SPID ORDER BY r.cpu_time + r.logical_reads / 10.0 DESC; -- 再配 sys.dm_exec_sessions 看 program_name 与 login_time,能定位到应用与账号。

DMV 的两个口径:累计与实时

用 DMV 办案要分清账本口径。sys.dm_os_wait_stats 与 sys.dm_exec_query_stats 是累计账:从实例启动记到现在,适合看"这段时间系统的慢性病排行",但重启清零、无法回放细节。实操技巧是差分采样:把计数快照存临时表,跑嫌疑业务十分钟,再取一次差值——累计账立刻变成"这十分钟"的增量账,噪声大幅下降。sys.dm_exec_requests 与 sys.dm_os_waiting_tasks 是实时账:此刻谁在跑、谁在等、等什么,适合抓现行。两本账配合的标准节奏:实时账抓现场,累计账看背景,差分采样定区间。

💡 累计账有个隐藏信息:实例启动时间(sys.dm_os_sys_info 里的 sqlserver_start_time)。拿到任何 DMV 数据先对一眼启动时间——"排行榜第一的等待累计两小时"在启动三小时的实例上和启动三个月的实例上,严重程度完全是两个故事。

扩展事件:定点的低开销采集

老一代 SQL 跟踪(Profiler)开销大且已弃用,现在的标准是扩展事件。三个日常场景的配置思路:抓死锁图(xml_deadlock_report 事件,全程低频,开了就别关,第 5 章尸检的证据源);抓慢语句(sql_batch_completed 加 rpc_completed 事件,过滤 duration 阈值,输出到环形缓冲或文件);抓特定行为(page_split、database_file_size_change、lock_escalation——分别对应碎片、自动增长、锁升级三类隐患的实锤取证)。原则是采集带过滤、输出设上限:扩展事件的低开销建立在"别什么都记"的纪律上。

-- 一个最小可用的慢语句采集会话 CREATE EVENT SESSION [抓慢语句] ON SERVER ADD EVENT sqlserver.sql_batch_completed( ACTION(sqlserver.client_app_name, sqlserver.database_name) WHERE duration > 3000000), -- 只记 3 秒以上的批次 ADD TARGET package0.ring_buffer -- 内存环形缓冲,自动滚动 WITH (MAX_MEMORY = 4096 KB); ALTER EVENT SESSION [抓慢语句] ON SERVER STATE = START; -- 结案后记得 ALTER ... STATE = STOP 并 DROP:采集会话是工具不是常驻装饰。

本节要点回顾

  • 三格分工:DMV 查现状与近期、扩展事件盯特定行为、计数器看宏观趋势,选错镜子看不清病灶;
  • 等待统计是分诊入口:剔掉系统噪声看前五名,它决定后面走哪条支线;
  • 分清两本账:累计账看慢性病要差分采样定区间,实时账抓现场,启动时间是账本的页码;
  • 扩展事件取代 Profiler:带过滤、设上限、用完即停,低开销是纪律换来的;
  • 查询包落地:等待总账与资源烧查两条查询存成模板,接手任何实例先跑一遍存底;
  • 看见先于改动:本章只解决"看见",怎么读、怎么改是后两节的事。

工具备齐了。下一节进入诊断学:CPU、内存、I/O 三大瓶颈各自的指纹,以及它们如何互相伪装、互相传导。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U