视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
SqlServer应用之sys.dm_os_waiting_tasks引发的疑问(上)
2020-11-09 07:02:32 责编:小采
文档


很多人在查看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 )

    查询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=720575940310976“  这个信息中我们知道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条等待?并行计划怎么执行的? 我们下篇继续说....

您可能感兴趣的文章:

  • SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(中)
  • SQL Server 2016里的sys.dm_exec_input_buffer的问题
  • 下载本文
    显示全文
    专题