本文出处: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类型的等待的更多相关文章

  1. delphi 转换sql server 中的 bit类型

    FieldByName('e').AsBoolean = false 其中e为 sql server 中的bit类型.

  2. 浅析SQL Server中的执行计划缓存(上)

    简介 我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径.当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse).绑定(Bind).查询 ...

  3. C#操作SQL Server中的Image类型数据

    该例子是一个对SQL Server数据类型的一个操作例子,具有写入.读取功能. 1:准备数据库 1)创建数据库 Test 2)创建表 Table_1 (分别有2个字段:id(Int).photo(Im ...

  4. SQL Server中与IO相关的等待类型:IO_COMPLETION和PAGEIOLATCH_*

    一个大的SQL语句操作,执行计划中包含了一个merge join操作,观察到SQL长时间处于IO_COMPLETION等待状态,如果是读取相关的表的数据,服务器应该全力为其服务,但是服务器的物理IO又 ...

  5. SQL Server中的uniqueidentifier类型

    uniqueidentifier类型可以配合T-SQL中的newid和newsequentialid来生成唯一标识符,具体区别如下(摘抄自微软官方文档). Nonsequential GUIDs: Y ...

  6. 在Sql Server中使用Guid类型的列及设置Guid类型的默认值

    1.列的类型为uniqueidentifier 2.列的默认值可以设为newid()

  7. .SQL Server中 image类型数据的比较

    原文:.SQL Server中 image类型数据的比较 在SQL Server中如果你对text.ntext或者image数据类型的数据进行比较.将会提示:不能比较或排序 text.ntext 和 ...

  8. 浅析SQL Server数据库中的伪列以及伪列的含义

    SQL Server中的伪列 下午看QQ群有人在讨论(非聚集)索引的存储,说,对于聚集索引表,非聚集索引存储的是索引键值+聚集索引键值:对于非聚集索引表,索引存储的是索引键值+RowId,这应该是一个 ...

  9. SQL SERVER中LIKE使用变量类型输出结果不同

    前言:Sql Server中LIKE里面使用不同的变量类型导致查询结果不一致的问题,其实看似有点让人不解的现象背后实质跟数据类型的实现有关. 一.我们先来创建示例演示具体操作 CREATE TABLE ...

随机推荐

  1. linux下的网络通信设置:openssh、PuTTY、tightVNC

    OpenSSH的安装: windows上安装PuTTY:  PuZZY上传文件到linux: 1.在window下的cmd中cd到PuZZY所在的文件夹下 2.使用pscp命令上传文件 3.使用psc ...

  2. Version 版本定义规则

    Version 定义规则:2.3.1012 主版本号: 表示项目的重大架构变更此版本号: 表示较大范围的功能添加和变化增量版本号: 一般表示重大bug修复2.3.1012snapshot   快照al ...

  3. 腾讯微信被怼,iOS版微信不能打赏了

    2017年4月19日,估计很多有着大量粉丝的微信自媒体作者会感到很不爽,因为他们的苹果粉丝再也无法很爽快地.肆意.任性地打赏他们了,按目前iphone手机的占有率,估计打赏率会掉一半以上. 据微信派微 ...

  4. mybatis的插件,挺好支持下

    利用 Mybatis-generator自动生成代码http://www.cnblogs.com/yjmyzz/p/4210554.html Mybatis 通用 Mapper3 https://gi ...

  5. Android 硬编码

    public class TextViewActivity extends Activity { // 声明TextView对象 private TextView textView; @Overrid ...

  6. 内存大小设置 Java heap space错误

    1. 问题描述 当从数据库中查询大量的数据,每个模板取出来几百万条数据,或者是频繁的刷新项目.模板时就会占用Java虚拟机JVM的大量内存,超过内存就会出现报java.lang.OutOfMemory ...

  7. es6(11)--Proxy,Reflect

    //Proxy,Reflect { let obj={ time:'2018-06-25', name:'net', _r:123 }; let monitor = new Proxy(obj,{ / ...

  8. fatal error C1083: Cannot open include file: 'openssl/opensslv.h'

    在安装针对ELK系统的警告工具elastalert时,报错: fatal error C1083: Cannot open include file: 'openssl/opensslv.h',如下图 ...

  9. .NET MVC 保存Session值,6位数验证码

    //6位数验证码: Random rm = new Random(); , ).ToString(); //MVC控制器Action中 保存session值 System.Web.HttpContex ...

  10. spring配置和下载

    步骤一:下载 Spring 的开发包: 官网:http://spring.io/ 下 载 地 址 : http://repo.springsource.org/libs-release-local/o ...