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 引发的疑问(中)

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

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
(0)

相关推荐

  • 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

  • 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 可以看出

  • 使用GruntJS构建Web程序之Tasks(任务)篇

    如何自定义Grunt任务 有时我们需要写一些自己的grunt任务,下面是一个具体例子 一.准备 1. 新建一个目录g12. 新建package.json,放入g13. 新建Gruntfile.js,放入g1 package.json 复制代码 代码如下: {    "name": "g1",    "version": "0.1.0",    "author": "@snandy",  

  • 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中使用扩展事件获取Session级别的等待信息及SQLServer 2016中Session级别等待信息的增强

    什么是等待 简单说明一下什么是等待: 当应用程序对SQL Server发起一个Session请求的时候,这个Session请求在数据库中执行的过程中会申请其所需要的资源, 比如可能会申请内存资源,表上的锁资源,物理IO资源,网络资源等等, 如果当前Session运行过程中需要申请的某些资源无法立即得到满足,就会产生等待. SQL Server会以不用的方式来展现这个等待信息,比活动Session的等待信息,实例级的等待信息等等. SQL Server中,等待事件是作为DBA进行TroubleSh

  • MySQL和SQLServer的比较

    转自: http://www.qqread.com/mysql/z442108305.html 对于程序开发人员而言,目前使用最流行的两种后台数据库即为MySQL和SQLServer.这两者最基本的相似之处在于数据存储和属于查询系统.你可以使用sql来访问这两种数据库的数据,因为它们都支持ansi-sql. 还有,这两种数据库系统都支持二进制关键词和关键索引,这就大大地加快了查询速度.同时,二者也都提供支持xml的各种格式.除了在显而易见的软件价格上的区别之外,这两个产品还有什么明显的区别吗?在

  • sqlserver 普通用户运行错误解决方法补充

    在教程Windows2003服务器安装及设置教程--MSSQL安全篇一(将MS SQL SERVER运行于普通用户下)中,笔者说到第十一步"设置完目录的权限后,就需要将MS SQL SERVER的运行用户设置为mssqlrun:"是通过在windows2003的管理工具中"服务"来实现的,一直这样操作没有问题过,但今天就遇到了这样做无法启动microsoft sql server的情况,解决过程如下: 检查NTFS权限,没有发现问题: 重新设置用户,情况依然如此:

  • 浅谈C#中简单的异常引发与处理操作

    异常和异常处理 C# 语言的异常处理功能可帮助您处理程序运行时出现的任何意外或异常情况.异常处理使用 try.catch 和 finally 关键字尝试某些操作,以处理失败情况,尽管这些操作有可能失败,但如果您确定需要这样做,且希望在事后清理资源,就可以尝试这样做.公共语言运行时 (CLR)..NET Framework 或任何第三方库或者应用程序代码都可以生成异常.异常是使用 throw 关键字创建的. 很多情况下,异常可能不是由代码直接调用的方法引发,而是由调用堆栈中位置更靠下的另一个方法所

  • SQL Server使用游标处理Tempdb究极竞争-DBA问题-程序员必知

    SQL Server tempdb分配竞争算是DBA老生常谈的问题了,几乎现在所有的DBA都知道多建几个文件来解决/缓解问题.但是深层次的的竞争依旧不可避免.这里给大家剖析下游标在tempdb中的特点使其在一定场景下替代临时表/表变量对象,解决深层次的tempdb竞争问题. 在抛出这个不可避免的问题之前我们先简要看下什么是tempdb竞争. 我们拿SQL Server创建一个临时表的过程来描述 1 在系统表中创建表的条目(系统数据页中) 2 分配一个IAM页并找到一个混合区在PFS页中标记 3

  • Sql Server中通过sql命令获取cpu占用及产生锁的sql

    获取SQLSERVER中产生锁的SQL语句 SELECT SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) as statement_text FROM sys.dm_exec_qu

  • ASP.net中网站访问量统计方法代码

    一.建立一个数据表IPStat用于存放用户信息 我在IPStat表中存放的用户信息只包括登录用户的IP(IP_Address),IP来源(IP_Src)和登录时间(IP_DateTime),些表的信息本人只保存一天的信息,如果要统计每个月的信息则要保存一个月.因为我不太懂对数据日志的操作,所以创建此表,所以说我笨吧,哈哈. 二.在Global.asax中获取用户信息 在Global.asax的Session_Start即新会话启用时获取有关的信息,同时在这里实现在线人数.访问总人数的增量统计,代

随机推荐