很多人在查看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条等待?并行计划怎么执行的? 我们下篇继续说....

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

最新文章

  1. CSS3与页面布局学习笔记(八)——浏览器兼容性问题与前端性能优化方案
  2. node.js学习笔记(二)
  3. 剑指Offer 合并两个排序的链表
  4. Swift3.0语言教程获取字符串编码与哈希地址
  5. Play!framework 项目部署到Tomcat
  6. ActiveMQ入门实例(转)
  7. php函数serialize()与unserialize()
  8. UIDevice-b
  9. java 后台线层也叫守护线层
  10. paip.php-gtk 桌面程序 helloworld总结
  11. org.apache.poi.ss.usermodel 类操作excel数据遗漏
  12. MySQL学习(二)索引与锁 --- 2019年1月
  13. Windows Tomcat 日志输出到 catlina.out 按日期输出,自启动
  14. 前置通知也能对参数进行加工 通过joiPoint这个方法
  15. Centos7.6 在LNMP上部署禅道
  16. MacBook Pro维修过程
  17. java多线程快速入门(十七)
  18. webpack打包之无依赖模块
  19. svn 目录
  20. Android hide Navigation bar

热门文章

  1. WCF学习之旅—WCF服务部署到应用程序(十)
  2. 浅谈 linux 例行性工作 crontab (linux定时任务)
  3. 【原】SDWebImage源码阅读(五)
  4. 【原】SDWebImage源码阅读(二)
  5. 【完全开源】微信客户端.NET版
  6. Android线程管理之ExecutorService线程池
  7. -Android -线程池 批量上传图片 -附php接收代码
  8. JavaScript 跨域漫游
  9. Node学习笔记(一):stream流操作
  10. 用JWT来保护我们的ASP.NET Core Web API