SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(下)_MsSql

sys.dm_os_waiting_tasks 引发的疑问(下)

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

    给出前两篇的连接:

SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(上)

SqlServer应用之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篇文章的语句代码为了方便全都截图的,情景模拟的代码都很简单,就不贴出来了) 

 

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

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

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

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

    

个人猜测所谓并行其实就是每个物理操作符的多线程同时操作,但单单这一个例子是不能说明问题的。SQL 也不会傻到并行只是操作符级别的吧? 这个没有找到明确的答案,继续研究争取有结论!!!

    另一个问题union all 每个union 部分为什么不能同时执行?难道真的是操作符级别的多线程并行?

    希望大神给解答呀!!!!

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

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

这个是在查询执行的时候 一直获取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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索os
, waiting
, dm
Tasks
dm os waiting tasks、tasks、linshi tasks、task scheduled tasks、vscode tasks.json,以便于您获取更多的相关知识。

时间: 2024-08-25 17:58:24

SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(下)_MsSql的相关文章

SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(中)_MsSql

通过上篇文章给大家介绍了SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(上) ,说了一下sys.dm_exec_requests 和 sys.dm_os_waiting_tasks 在获取并行等待的时候得不同结果,这一篇我们谈论下我的第二个疑问:为什么一个并行计划(4线程)却一下出现了那么多等待,SQL的并行到底是怎么执行的!!!! 先贴以下上篇sys.dm_os_waiting_tasks 的结果图:   我们分析一下这个结果的task_address 可以

SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(下)

sys.dm_os_waiting_tasks 引发的疑问(下) 前面写了两篇了,其实不光是说sys.dm_os_waiting_tasks的应用,研究了挺长时间的并行,自己有了一些理解,所以分享出来希望有什么理解错误的地方大神们及时纠正!! 给出前两篇的连接: SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(上) SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(中) 前面两篇的编写有一个疑惑...最初认为的并行比如这个语句

SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(上)_MsSql

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

SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(中)

通过上篇文章给大家介绍了SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(上) ,说了一下sys.dm_exec_requests 和 sys.dm_os_waiting_tasks 在获取并行等待的时候得不同结果,这一篇我们谈论下我的第二个疑问:为什么一个并行计划(4线程)却一下出现了那么多等待,SQL的并行到底是怎么执行的!!!! 先贴以下上篇sys.dm_os_waiting_tasks 的结果图: 我们分析一下这个结果的task_address 可以看出

SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(上)

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

针对distinct疑问引发的一系列思考_MsSql

有人提出了这样一个问题,整理出来给大家也参考一下 假设有如下这样一张表格: 这里的数据,具有如下的特征:在一个DepartmentId中,可能会有多个Name,反之也是一样.就是说Name和DepartmentId是多对多的关系. 现在想实现这样一个查询:按照DepartmentID排完序之后(第一步),再获取Name列的不重复值(第二步),而且要保留在第一步后的相对顺序.以本例而言,应该返回三个值依次是:ACB 我们首先会想到下面这样一个写法 select distinct name from

SQLServer 2008 CDC功能实现数据变更捕获脚本_MsSql

CDC:Change Data Capture 复制代码 代码如下: --步骤:本文中以GPOSDB为例 --第一步.对目标库显式启用CDC:--在当前库使用sys.sp_cdc_enable_db.返回0(成功)或1(失败).--注意,无法对系统数据库和分发数据库启用该功能.且执行者需要用sysadmin角色权限.--该存储过程的作用域是整个目标库.包含元数据.DDL触发器.cdc架构和cdc用户.--使用以下代码启用:USE GPOSDB  --要启用CDC的数据库GOEXECUTE sys

SQLSERVER如何查看索引缺失及DMV使用介绍_MsSql

当大家发现数据库查询性能很慢的时候,大家都会想到加索引来优化数据库查询性能,但是面对一个复杂的SQL语句,找到一个优化的索引组合对人脑来讲,真的不是一件很简单的事. 好在SQLSERVER提供了两种"自动"功能,给你建议,该怎么调整索引 第一种是使用DMV 第二种是使用DTA (database engine tuning advisor) 数据库引擎优化顾问 这篇文章主要讲第一种 从SQL2005以后,在SQLSERVER对任何一句语句做编译的时候,都会去评估一下, 这句话是不是缺少

如何查看SQLSERVER中某个查询用了多少TempDB空间_MsSql

    在SQL Server中,TempDB主要负责供下述三类情况使用: 内部使用(排序.hash join.work table等) 外部使用(临时表,表变量等) 行版本控制(乐观并发控制)       而对于内部使用,一些比较复杂的查询中由于涉及到了大量的并行.排序等操作时就需要大量的内存空间,每一个查询在开始时都会由SQL Server预估需要多少内存,在具体的执行过程中,如果授予的内存不足,则需要将多出来的部分由TempDB处理,这也就是所谓的Spill to TempDB.