SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(中
深入了解SQL Server中的sys.dm_os_waiting_tasks动态管理视图引发的疑问(中篇)
上篇我们已经了sys.dm_exec_requests和sys.dm_os_waiting_tasks在获取并行等待时的差异。这篇文章,我们将进一步我的第二个疑问:为什么一个并行计划(例如4线程)会产生如此多的等待?SQL的并行执行机制是如何运作的?
让我们回顾一下上篇文章中sys.dm_os_waiting_tasks的结果。从结果图中,我们可以看到task_address列,去掉重复后实际上只有9个task。这意味着在一个4线程的并行计划中,会有9个task。那么,什么是线程、task、worker和scheduler?这对理解SQL Server的并行执行机制至关重要。
1. scheduler:每个逻辑CPU在SQL Server中都有一个与之对应的scheduler。它是SQL层面上的CPU对象。只有获得scheduler所有权的worker才能在这个逻辑CPU上运行。逻辑CPU的数量取决于SQL Server从Windows层面看到的CPU数目。
2. worker:每个worker与一个线程(或纤程fiber)相对应,是SQL Server任务的执行单位。worker会固定代表一个线程,并且和一个scheduler相绑定。
3. task:在worker上运行的最小任务单元,最简单的task就是一个简单的batch。
当我们谈论SQL Server的并行执行机制时,我们需要理解上述概念。在一个并行计划中,虽然看起来只有4个线程,但实际上由于任务的分解和调度,可能会产生更多的task和worker。每个scheduler都有worker的上限值,当有新任务要运行而当前没有空闲的worker时,scheduler会创建新的worker。
SQL Server的任务调度并不直接调度线程,而是调度worker。这意味着SQL Server能够控制任务调度。当某个worker空闲超过一定时间(例如15分钟)或SQL Server遇到内存压力时,scheduler可能会删除这个worker及其对应的线程,以节省内存开销。
一个并行计划(例如4线程)产生多个等待并非异常现象,这是由于SQL Server的并行执行机制和任务调度的复杂性所导致的。理解这些概念有助于我们更好地理解和优化SQL Server的性能。
当客户向我们发出关于狼蚁网站SEO优化的请求时,我们的团队会迅速响应。这不仅仅是两个简单的SQL任务,而是涉及到SQL SERVER的深层次工作机制。想象一下,你在执行一系列的数据库查询,每一个查询都是一个任务,等待着SQL SERVER的调度。
SQL SERVER中的SQLOS任务调度就像是一场精心编排的舞蹈。每个任务都会获得一个worker,这个worker就像是一个舞者,在逻辑scheduler的舞台上舞动。当第一个任务(如select @@servername)开始时,它会占用一个worker,直到任务完成或主动释放。接着,第二个任务(如select getdate())会开始运行,可能由另一个worker完成。这些worker可能是不同的舞者,甚至在不同的舞台上进行表演。一旦一个任务开始,它就会持续运行,直到完成,期间不会被其他任务打断。
如果某个任务被阻塞,那么对应的worker就会进入等待状态,仍然占用着舞台。这时,SQL SERVER的任务调度算法就会发挥作用。这个算法是非抢占式的,意味着worker会一直运行,直到任务结束或主动释放资源。在这个过程中,会有一个叫做yielding的动作,即worker主动让出舞台给其他等待的任务。每个scheduler都有一个等待列表,所有准备执行的任务都会在这个列表中排队,按照先进先出的原则等待执行。
SQLSERVER会定义许多yielding的规则,来控制一个任务在scheduler上的运行时间。比如,当worker读取数据页时,如果运行时间超过4ms,就会进行yielding;每进行64KB的结果集排序时,也会触发yielding。甚至在语句编译的过程中,也会有yielding的发生。这些规则确保了任务的合理运行,避免了长时间占用资源。
现在让我们回到并行处理的话题。当一个并行处理任务被分配给多个task和worker时,这些worker会被4个scheduler调度。其中一些scheduler负责申请数据,而另一些则处于等待状态。等待的scheduler可能与当前的执行计划有关,它们在数据获取时进行等待,确保数据的正确性和完整性。
那么,疑问解决了吗?显然还有疑问存在。但是我们已经进入了中篇,我们相信通过进一步的学习和,我们能够解答所有的疑问。让我们继续SQL SERVER的奥秘吧!更多的知识和见解等待我们去发现。期待下一篇文章能为我们揭示更多的秘密!
编程语言
- SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(中
- ResourceBundle类在jsp中的国际化实现方法
- 整体刷新和局部刷新frameset窗口问题深入探讨
- php header函数的常用http头设置
- jQuery日程管理控件glDatePicker用法详解
- PHP中使用sleep函数实现定时任务实例分享
- Git基本常用命令
- javascript实现九宫格相加数值相等
- 关于网页中的无缝滚动的js代码
- 小程序绑定用户方案优化小结
- php基于session实现数据库交互的类实例
- 浅析前端路由简介以及vue-router实现原理
- 探讨各种PHP字符串函数的总结分析
- Git恢复之前版本的两种方法reset、revert(图文详解
- php内核解析:PHP中的哈希表
- javascript事件捕获机制【深入分析IE和DOM中的事件