SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(上)
很多人在查看SQL语句等待的时候都是通过sys.dm_exec_requests查看,等待类型也是通过wait_type得出,sys.dm_os_waiting_tasks也可以看到session的等待那么有什么区别呢....,这篇文章给大家介绍SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(上),需要的朋友参考下 【sys.dm_os_waiting_tasks】和【sys.dm_exec_requests】是SQL Server中用于诊断性能问题的两个重要动态管理视图(DMV)。它们都提供了关于SQL Server执行上下文等待信息的洞察,但关注的焦点有所不同。 sys.dm_exec_requests 主要提供当前会话中活动请求的状态信息,包括但不限于以下几点: 1. session_id:执行请求的会话ID。 2. request_id:请求的ID,在每个会话内是唯一的。 3. command:执行的SQL命令类型(例如SELECT、INSERT、UPDATE等)。 4. wait_type:请求当前正在等待的事件类型。 5. wait_time:请求等待的时间(以毫秒为单位)。 然而,sys.dm_exec_requests 并不总是能提供完整的等待信息,尤其是在并行查询中。例如,在并行查询中,如果一个任务被另一个任务阻塞,sys.dm_exec_requests 可能只能显示全局的并行等待类型(如CXPACKET),而不能指出具体的资源争用细节。 相比之下,sys.dm_os_waiting_tasks 提供了更详细的等待任务信息,它揭示了系统中所有等待任务的详细状态,包括: 1. waiting_task_address:等待任务的内存地址。 2. session_id 和 exec_context_id:分别代表会话ID和执行上下文ID,这有助于定位到具体的查询执行上下文。 3. wait_duration_ms:任务等待的总时间。 4. wait_type:等待事件的具体类型,如LCK_M_S(共享锁等待)和CXPACKET(并行资源等待)。 5. resource_address 和 blocking_task_address:揭示了资源争用和阻塞情况。 6. blocking_session_id 和 blocking_exec_context_id:显示哪个会话或执行上下文正在造成阻塞。 在并行查询场景中,sys.dm_os_waiting_tasks 能够帮助识别每个并行线程的等待情况,包括LCK_M_S(锁定等待)和其他等待类型如CXPACKET(并行资源调度等待)。例如,当一个并行查询涉及到多个线程同时扫描表时,可能会出现多个LCK_M_S等待,这表示线程正在等待获取表的锁定。而CXPACKET等待通常与并行操作中的资源调度有关,例如线程之间的通信等待。 在上述示例中,通过sys.dm_os_waiting_tasks,我们可以发现并行查询中的LCK_M_S等待和CXPACKET等待,其中LCK_M_S可能与表扫描有关,而CXPACKET则涉及并行操作的同步。同时,sys.dm_exec_requests 显示的等待类型(CXPACKET)和阻塞信息(blocking_session_id为0)可能并不准确反映实际的资源竞争情况,特别是在并行计划执行时。 总结来说,sys.dm_exec_requests 更适用于快速查看当前请求的状态和等待信息,而sys.dm_os_waiting_tasks 则更适合深度分析系统的等待行为,特别是当面临复杂的阻塞和等待问题时。两者结合使用,能够为SQL Server性能调优提供更全面的视角。在实际问题排查中,根据具体需求选择合适的视图,并结合其他工具(如SQL Profiler或XEvents)以获取更完整的信息,将有助于定位和解决问题。
- 粉丝: 7
- 资源: 943
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助