浅析SQL Server 中的SOS_SCHEDULER_YIELD类型的等待
本文出处:http://www.cnblogs.com/wy123/p/6856802.html
进程的状态转换
在说明SOS_SCHEDULER_YIELD等待之前,先简要介绍一下进程的状态(迷迷糊糊记得操作系统原理课上讲过,三态五态转换的,比下面这个图要复杂,大部分都还给老师了)。
如下图,分别是:运行态,阻塞态,就绪态。各个状态之间的转换关系及粗略原因如下:
运行态-->阻塞态,原因:等待某种资源的完成,比如IO等。
阻塞态-->就绪态,原因:锁请求的资源已完成,加入获取CPU队列中(going directly to the bottom of the Runnable Queue for the scheduler)。
运行态-->就绪态,原因:用完了一个CPU的时间片周期(当前线程仍未完成,需要CPU资源),那么就等待进入下一个时间片周期。
(因为一个线程不会永久性占用CPU,CPU资源而是各个线程轮询占用的一个过程)
SOS_SCHEDULER_YIELD类型等待
SQL Server中的调度机制也类似于进程的三态模型,运行,阻塞,就绪。
关于SOS_SCHEDULER_YIELD的问题之一是SOS_SCHEDULER_YIELD这种等待类型并非一种真正的等待,
当此种等待类型发生的时候,原因是线程耗尽了它的4ms的(时间片)轮询周期,并且自动地让出(voluntary yields)CPU资源,
直接被调度器排列在可执行新线程队列的末尾,绕过等待信息列表,
此时的线程由执行态转换为就绪态,虽然此等待记录为SOS_SCHEDULER_YIELD等待,并不是因为真正的资源等待所导致的的。
而是CPU轮询周期完成之后,当前线程任务仍没有完成,需要等待轮询下一个周期来获取CPU资源执行导致的。
也就是说当然线程的执行一直在就绪和执行态之间转换,从中可以推断出当前线程是一个较为耗费CPU的操作。
不少参考资料上都是是扫描( large scans happening ),如下
You want to investigate these waits if they’re a prevalent wait on your server,
as they could be an indicator of large scans happening (of data that’s already in memory)
where you’d really rather have small index seeks.
不过本人觉得这是全表或者索引扫描是仅仅存在的原因之一
其他有可能的原因,比如Hash Join,大结果集的Sort,Distinct等等,都是比较耗费CPU的。
另外就是,如果CPU确实比较忙,比如操作系统上的进程很多,CPU使用率很高
一个线程从就绪态到运行态需要等待的时间也会变长,因为等待占用CPU时间片的线程比较多。
总之,要明白的是,产生SOS_SCHEDULER_YIELD等待是因为当前线程需要耗费大量的CPU资源,
而CPU的调用机制是分时间片轮询供各个线程使用的,当前线程在CPU周期结束的时候,仍旧没有完成运算任务
那么就要等到下一个CPU周期去获取CPU资源,SOS_SCHEDULER_YIELD等待因此产生。
总结
SOS_SCHEDULER_YIELD类型等待并非真正意义上的等待资源,
而是CPU的一种调度机制导致较为耗费CPU资源的线程在执行过程中轮询获取CPU资源的一种现象。
有可能是线程运行的SQL语句本身性能较低,比如全面扫描之类的,或者是SQL语句本身逻辑运算,产生了Hash Join,排序之类的
如果发现有非常严重的SOS_SCHEDULER_YIELD类型等待,也应该慎重对待,比如从执行计划等方面去分析是否是正常的
是否确实是数据高CPU使用类型的查询,否则就要从SQL语句入手分析优化了。
参考:https://www.zhihu.com/question/53125711
:https://www.sqlskills.com/blogs/paul/identifying-queries-with-sos_scheduler_yield-waits/
浅析SQL Server 中的SOS_SCHEDULER_YIELD类型的等待的更多相关文章
- delphi 转换sql server 中的 bit类型
FieldByName('e').AsBoolean = false 其中e为 sql server 中的bit类型.
- 浅析SQL Server中的执行计划缓存(上)
简介 我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径.当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse).绑定(Bind).查询 ...
- C#操作SQL Server中的Image类型数据
该例子是一个对SQL Server数据类型的一个操作例子,具有写入.读取功能. 1:准备数据库 1)创建数据库 Test 2)创建表 Table_1 (分别有2个字段:id(Int).photo(Im ...
- SQL Server中与IO相关的等待类型:IO_COMPLETION和PAGEIOLATCH_*
一个大的SQL语句操作,执行计划中包含了一个merge join操作,观察到SQL长时间处于IO_COMPLETION等待状态,如果是读取相关的表的数据,服务器应该全力为其服务,但是服务器的物理IO又 ...
- SQL Server中的uniqueidentifier类型
uniqueidentifier类型可以配合T-SQL中的newid和newsequentialid来生成唯一标识符,具体区别如下(摘抄自微软官方文档). Nonsequential GUIDs: Y ...
- 在Sql Server中使用Guid类型的列及设置Guid类型的默认值
1.列的类型为uniqueidentifier 2.列的默认值可以设为newid()
- .SQL Server中 image类型数据的比较
原文:.SQL Server中 image类型数据的比较 在SQL Server中如果你对text.ntext或者image数据类型的数据进行比较.将会提示:不能比较或排序 text.ntext 和 ...
- 浅析SQL Server数据库中的伪列以及伪列的含义
SQL Server中的伪列 下午看QQ群有人在讨论(非聚集)索引的存储,说,对于聚集索引表,非聚集索引存储的是索引键值+聚集索引键值:对于非聚集索引表,索引存储的是索引键值+RowId,这应该是一个 ...
- SQL SERVER中LIKE使用变量类型输出结果不同
前言:Sql Server中LIKE里面使用不同的变量类型导致查询结果不一致的问题,其实看似有点让人不解的现象背后实质跟数据类型的实现有关. 一.我们先来创建示例演示具体操作 CREATE TABLE ...
随机推荐
- jvm内存分区及各区线程问题
一.java内存模型图 二.直观分类图 三.各区简单描述 1.堆(heap):主要存放对象的实例也包括数组,是垃圾管理的主要作用区,是线程共享的 2.栈(stack):①虚拟机栈:描述的是 Java ...
- 关于-RegExp
// exec() exec() 查找并返回当前的匹配结果,并以数组的形式返回. // test() test() 方法检索字符串中的指定值.返回值是 true 或 false. // compile ...
- Linux coredump 的打开和关闭
(转载自 http://blog.sina.com.cn/s/blog_6b3765230100lazj.html) ulimit -c 输出如果为0,则说明coredump没有打开 ulimit - ...
- ECharts学习记录
一.ECharts在GitHub的地址以及需要引入文件地址: 1.Github地址:https://github.com/ecomfe/echarts 2.官网下载文件地址:http://echart ...
- ELK集群部署实例(转)
转载自:http://blog.51cto.com/ckl893/1772287,感谢原博. 一.ELK说明 二.架构图 三.规划说明 四.安装部署nginx+logstash 五.安装部署redis ...
- Javascript函数心得
Javascript函数 Javascript函数是由事件驱动的或者当他被调用时执行的可重复使用的代码块.所以说我们光创建了函数不调用是没有啥用的,我们必须得调用它才能执行. 1.什么是函数 (1)函 ...
- 微信小程序笔记<一>初识小程序
一.IDE界面介绍 编辑界面 调试界面 项目管理界面 左侧工具介绍 二.项目文件类型及结构介绍 这是一个初始小程序的项目目录,其中涉及四种文件类型: *.js:JavaScript文件(JavaScr ...
- Linux终端小技巧
注释:以下都是自己遇到的问题,问题太多也记不住,每次上网查找又比较麻烦,索性记录一下随笔! 1.进程的挂载与运行 暂停运行一个进程:Ctrl+Z 其中这个进程可再被操作,如:后台运行.再次运行等 ...
- 最简单的DHCP服务
这几天在准备网络安装linux操作系统.最后决定用pxe + kickstart 的方式完成.原理.方案弄完了之后,开始搭建,结果被DHCP给挡住了.这不就得研究研究最简单最实用的DHCP使用方法. ...
- uva-270-排序
题意:很多个点,问,最多有多少个点在同一条直线上 #include <algorithm> #include <iostream> #include <string> ...