很多人在查看SQL语句等待的时候都是通过sys.dm_exec_requests查看,等待类型也是通过wait_type得出,sys.dm_os_waiting_tasks也可以看到session的等待那么有什么区别呢....

    废话不多说直接开整.

    测试版本2012

    sys.dm_os_waiting_tasks 的字段说明:

    

waiting_task_address

varbinary(8)

等待任务的地址。

session_id

smallint

与任务关联的会话的 ID。

exec_context_id

int

与任务关联的执行上下文的 ID。

wait_duration_ms

int

此等待类型的总等待时间(毫秒)。此时间包含 signal_wait_time

wait_type

nvarchar(60)

等待类型的名称。

resource_address

varbinary(8)

任务等待的资源的地址。

blocking_task_address

varbinary(8)

当前持有此资源的任务。

blocking_session_id

smallint

正在阻塞请求的会话的 ID。如果此列为 NULL,则表示请求未被阻塞,或锁定会话的会话信息不可用(或无法进行标识)。

-2 = 阻塞资源由孤立的分布式事务拥有。

-3 = 阻塞资源由延迟的恢复事务拥有。

-4 = 由于内部闩锁状态转换而无法确定阻塞闩锁所有者的会话 ID。

blocking_exec_context_id

int

正在阻塞的任务的执行上下文 ID。

    做个小例子:

    -----开启事务更新一张表并且不提交。

    begin tran
    update t1 set b = getdate()

    -----做一个查询 并且开启并行

    select * from t1 inner join t2 on t1.a = t2.a
    option (querytraceon 8649)

    查询sys.dm_os_waiting_tasks 的结果,udate :session 55, select : session 54,如图开一看到session 中出现了 21条等待(虚机给了双核4线程),那么可以看出wait_type 为LCK_M_S的有四条,这个可以理解是开并行起了四个线程要扫描表t1全部等待状态,从 resource_description 字段信息中我们看一下是否是T1表的等待。        

    

     从”ridlock fileid=1 pageid=109 dbid=7 id=lock1f03c7700 mode=X associatedObjectId=72057594038910976“  这个信息中我们知道ridlock fileid=1 pageid=109 dbid=7   

    dbcc traceon (3604)
    dbcc page(7,1,109,3)

    

    

     确定了LCK_M_S的四条确实是扫描表所产生的等待,那么其他的CXPACKET等待是什么鬼? 从规律中可以看出CXPACKET等待的分成四组每一组4条 exec_context_id分别是 5,6,7,8(四个等待扫表的线程),还有一个上图中的第十三行“exchangeEvent id=Port1fe7a2200 WaitType=e_waitPortOpen nodeId=0”  应该是调度的线程。

    sys.dm_os_waiting_tasks里在并行计划的执行中出现了 CXPACKET 和 LCK_M_S 那么我们来看一下 sys.dm_exec_requests 里是如何显示的(这里只取出试验用的字段)

    

    

    blocking_session_id 竟然是0 , wait_type 竟然是CXPACKET(并行等待,我们知道主要的等待原因不是这个),另外观察 发现这里面抓取的TASK_ADDRESS 是调度线程。经过其他实验得知 sys.dm_exec_requests 在并行的等待中无法获得真正的等待类型和资源。如果取消并行,执行一个串行计划两个视图得到的结果是一样的。

    例子中我们看出了sys.dm_exec_requests 和sys.dm_os_waiting_tasks 在实际使用中关于并行的区别,但不单单只有这一个疑问,4线程并行计划为什么一下会出现21条等待?并行计划怎么执行的? 我们下篇继续说....

    本篇内容均为自己的理解,如有错误请大神们及时指出!!谢谢

sys.dm_os_waiting_tasks 引发的疑问(上)的更多相关文章

  1. sys.dm_os_waiting_tasks 引发的疑问(中)

    上一篇我们说了一下sys.dm_exec_requests 和 sys.dm_os_waiting_tasks 在获取并行等待的时候得不同结果,这一篇我们谈论下我的第二个疑问:为什么一个并行计划(4线 ...

  2. sys.dm_os_waiting_tasks 引发的疑问(下)

    前面写了两篇了,其实不光是说sys.dm_os_waiting_tasks的应用,研究了挺长时间的并行,自己有了一些理解,所以分享出来希望有什么理解错误的地方大神们及时纠正!! 给出前两篇的连接: 上 ...

  3. Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  4. 一次Java线程池误用(newFixedThreadPool)引发的线上血案和总结

    一次Java线程池误用(newFixedThreadPool)引发的线上血案和总结 这是一个十分严重的线上问题 自从最近的某年某月某天起,线上服务开始变得不那么稳定(软病).在高峰期,时常有几台机器的 ...

  5. EMQ 学习---订阅$SYS主题,捕获客户端上下线消息

    acl.config文件定义了可订阅$SYS主题的权限. {allow, {user, "dashboard"}, subscribe, ["$SYS/#"]} ...

  6. 一个SQL注释引发的线上问题

    最近开始服务拆分,时间将近半个月.测试阶段也非常顺利,没有什么问题. 但上线之后的第二天,产品就风风火火的来找我们了,一看就是线上有什么问题.我们也不敢说,我们也不敢问,线上的后台商品忽然无法上架了, ...

  7. 【转】一次Java线程池误用(newFixedThreadPool)引发的线上血案和总结

    [转]原文链接:https://cloud.tencent.com/developer/article/1497826 这是一个十分严重的线上问题 自从最近的某年某月某天起,线上服务开始变得不那么稳定 ...

  8. 由一次PasswordBox密码绑定引发的疑问 ---> WPF中的附加属性的定义,以及使用。

    1,前几天学习一个项目的时候,遇到了PasswordBox这个控件,由于这个控件的Password属性,不是依赖属性,所以不能和ViewModel层进行数据绑定. 2,但是要实现前后端彻底的分离,就需 ...

  9. 从一个LocalDateTime引发的疑问

    一 公司有同事部署出错,然后查日志,找时间,从k8s得到的时间是  2017-06-16T09:38:48.580 +0000,然后他就纳闷了,因为他根本不会在9点部署好吧,而且9点大多数程序员都没开 ...

随机推荐

  1. Spark 生态系统组件

    摘要: 随着大数据技术的发展,实时流计算.机器学习.图计算等领域成为较热的研究方向,而Spark作为大数据处理的“利器”有着较为成熟的生态圈,能够一站式解决类似场景的问题.那你知道Spark生态系统有 ...

  2. select,epoll,poll比较

    介绍和比较 http://www.cnblogs.com/maociping/p/5132583.html 比较 http://www.dataguru.cn/thread-336032-1-1.ht ...

  3. H5拍照应用开发经历的那些坑儿

    一.项目简介 1.1.项目背景:这是一个在移动终端创新应用的项目,用户在浏览器端(微信/手Q)即可完成与金秀贤的合影,希望通过这样一种趣味体验,引发用户的分享与转发的热潮. 1.2.系统要求:ios6 ...

  4. http程序接口、调用(最入门级,文末附Demo)

    HTTP协议简介 既然是基于HTTP协议开发,那么就首先要了解下HTTP协议的相关内容- 在TCP/IP体系结构中,HTTP属于应用层协议,位于TCP/IP协议的顶层.浏览Web时,浏览器通过HTTP ...

  5. 集成学习之Adaboost算法原理小结

    在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习器之间存在强依赖关系,另一类是个体学习器之间不存在强依赖关系.前者的代表算法就是是boostin ...

  6. 制作自己的MVC框架(一)——简单粗暴的实现

    现在市面上有很多成熟的MVC框架,可以拿来直接用,但自己造一下轮子其实也挺有意思的. 下面先来看个最简单粗暴的MVC实现. 5个文件就能实现最简单的MVC,在Apache中设置一个虚拟目录,配置个简单 ...

  7. Oracle迁移:Linux->Windows

    源环境:RHEL6.4 + Oracle 11.2.0.4 目的环境:Windows 2003 需求:研发测试环境的Oracle数据库从Linux迁移到Windows,可以停机. 1.Windows安 ...

  8. 使用session页面控制登录入口及购物车效果的实现

          由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容.实际上在服务器端的 Session 文件,PHP 自动修改 Session 文件的权限,只 ...

  9. android使用PullToRefresh实现上拉加载和下拉刷新效果

    其实很早前就在博客园中也写过官方的下拉刷新控件SwipeRefreshLayout,但是这个控件仅仅支持下拉刷新,用起来还算可以.然而在我们实际开发应用中,很多地方都不止有下拉刷新,而且还有上拉加载的 ...

  10. golang 使用 iota

    iota是golang语言的常量计数器,只能在常量的表达式中使用. iota在const关键字出现时将被重置为0(const内部的第一行之前),const中每新增一行常量声明将使iota计数一次(io ...