sys.dm_os_waiting_tasks 引发的疑问(下)

摘要:
在前两篇文章的写作中有一个疑问……并行的最初思想是这样的:select*fromt1innerjoint2ont1.a=t2.aOPTION在我的理解中,并行是打开几个线程来获取T1数据,打开几个其他线程来获取t2数据,然后将结果关联起来形成最终的结果集。Begintranupdatet1setb=getdate()updatet2setb=get date()View sys dm_os_waiting_还有21个任务……但请注意,我特意使用了四个数据采集线程的资源_描述放在前面:keylockobjectid=72057594039042048dbid=7id=lock1ee280f00mode=XassociatedObjectId=720575940390 42048这次,T2被锁定(sys.objects是子数据库……越焦虑,越混乱!哈哈!在MASTER中查找partition_id=72057594039042048,还有一个值queue_messages_1067150847,INTERNAL_TABLE直接给了我一整圈!!

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

    给出前两篇的连接:

    上篇

    中篇

    废话不多说,直接开整。

    前面两篇的编写有一个疑惑...最初认为的并行比如这个语句:    

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

    在我的理解并行是开几个线程去获取T1数据,另外几个线程获取T2 数据,然后关联结果形成最后结果集。可是试验了才发现自己原来想的和看到的结果不太一样呀!!!!

    下面我们用前两篇的例子继续做试验...

    这次我们2张表同时给锁住,看看等待里是什么情况。

begin tran 
update t1 set b = getdate()
update t2 set b = getdate()

    查看sys.dm_os_waiting_tasks (3篇文章的语句代码为了方便全都截图的,情景模拟的代码都很简单,就不贴出来了)

    sys.dm_os_waiting_tasks 引发的疑问(下)第1张

    同样是21条...但是要注意,我特意把四个获取数据线程的 resource_description放在了前面:

keylock hobtid=72057594039042048 dbid=7 id=lock1ee280f00 mode=X associatedObjectId=72057594039042048

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

    这次锁的是T2了 (sys.objects 是分数据库...越着急越添乱哈哈  在MASTER里查partition_id = 72057594039042048 也有值 queue_messages_1067150847 ,INTERNAL_TABLE直接给我整蒙圈了!!细节呀~细节)但是可以看出其实并行不是像我理解那样两张表会同时扫描。执行计划可以看出要先扫描T2表,所以这个例子中只是锁住T2 ,如果和我想的执行方式(同时扫描T1、T2)一样应该出现T1 、T2两张表都有lck_m_s等待。

    语句及执行计划再贴一次:

    sys.dm_os_waiting_tasks 引发的疑问(下)第3张

      个人猜测所谓并行其实就是每个物理操作符的多线程同时操作,但单单这一个例子是不能说明问题的。SQL 也不会傻到并行只是操作符级别的吧?

    另一个问题union all 每个union 部分为什么不能同时执行?

 

     -----------------------------------------------2016-05-29 补充-------------------不只是操作符级别-----------

  并行部分可能有多个分支(Branches),每个Branch都可以同时执行(分支有自己的tasks),分支自身可以是并行,也可以是串行.但分支不会使用主线程thread zero)

  

  我的最大并行度设置为4,有三个branches,而这里我使用的线程数就是 4*3=12,再加上一个主线程 thread zero 这个并行查询我所使用的线程总数为13个

     sys.dm_os_waiting_tasks 引发的疑问(下)第4张

   并行计划详解请参见: 高大侠博客

  

深入解析SQL Server并行执行原理及实践(上)深入解析SQL Server并行执行原理及实践(下)

----------------------------------------------------------------------华丽的分割线----------------------------------------------------------------------------------------------

    篇幅限制,下面给出小段的测试代码,没有整理自己摘吧!

这个是在查询执行的时候 一直获取sys.dm_os_waiting_tasks 等待信息,并以@a 为分组 ,标示一次等待抓取,这样我们可以看到整个语句并行的等待。    

declare @a int
set @a = 0
while 1=1
begin 
insert into waiting_ecec
select @a ,*  from sys.dm_os_waiting_tasks a where session_id > 50 
set @a = @a + 1
end 


truncate table waiting_ecec
select * from waiting_ecec 

select a.resource_description,a.waiting_task_address,a.session_id,a.exec_context_id,a.wait_type,blocking_task_address,blocking_exec_context_id,blocking_session_id,
e.task_address,e.parent_task_address,worker_address from sys.dm_os_waiting_tasks a
left join sys.dm_os_tasks e on a.waiting_task_address =e.task_address 
and a.exec_context_id = e.exec_context_id 
where a.session_id > 50

SELECT  session_id,status,blocking_session_id,wait_type,last_wait_type,scheduler_id,task_address FROM sys.dm_exec_requests where session_id = 53

免责声明:文章转载自《sys.dm_os_waiting_tasks 引发的疑问(下)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SQL查询遍历数据方法一 [ 临时表 + While循环]系统图片uri的问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java 基本理论知识点

http://www.cnblogs.com/hellokitty1/p/4491808.html 1、main方法是怎么写的        public static void main(String [] args){}//最习惯的      public static void main(String  args[]){}      static p...

Android Runnable 运行在那个线程

Runnable 并不一定是新开一个线程,比如下面的调用方法就是运行在UI主线程中的: Handler mHandler=new Handler(); mHandler.post(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub }...

MySQL主从复制的实现过程

一、什么是主从复制   将主数据库中的DDL和DML操作通过二进制日志传输到从数据库上,然后将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保持一致。 基本原理:   MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。   MySQL复制是基于主服务器在二进制日志中跟踪所有对数据库的更改。因此,...

JVM 源码分析(四):深入理解 park / unpark

前言 Parker 源码调试与分析 park/unpark 原理总结 补充:jstack 命令和 kill 命令 前言 熟悉 Java 并发包的人一定对 LockSupport 的 park/unpark 方法不会感到陌生,它是 Lock(AQS)的基石,给 Lock(AQS)提供了挂起/恢复当前线程的能力。 LockSupport 的 par...

Java内存模型(JMM)总结

Java内存模型(JMM) 我们常说的JVM内存模型指的是JVM的内存分区;而Java内存模型是一种虚拟机规范。 Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,实现让Java程序在各种平台下都能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存是如何协同工作的:...

【转】CUDA程序优化要点

CUDA程序优化应该考虑的点:精度:只在关键步骤使用双精度,其他部分仍然使用单精度浮点以获得指令吞吐量和精度的平衡;    目前 GPU 的单精度性能要远远超过双精度性能,整数乘法、求模、求余等运算的指令吞吐量也较为有限。在科学计算中,由于需要处理的数据量巨大,往往采用双精度或者四精度才能获得可靠的结果,目前的 Tesla 架构还不能很好的满足高精度计算的...