zoukankan      html  css  js  c++  java
  • SQL Server的thread scheduling(线程调度)

     
    https://www.zhihu.com/question/53125711/answer/134461670
    https://www.zhihu.com/question/53125711
     
     
    SQL Server的thread scheduling(线程调度)是由SQL Server自己来完成的。它分为三个状态,running, suspended, runnable。我画了一个图来解释这三个状态:

    每一个thread在cpu上执行时候都是有一个quantum(时间片)的,当你的quantum用完了而你的任务还没有结束,这个thread就会自己释放CPU,直接进入runnable队列中排队等待下一次执行,这个直接释放CPU再次等待的过程叫yield。我们知道SQL Server中所有的wait都是有一个类型的,这种自己yield CPU并且等待下一次执行的类型就是sos scheduler yield。如果一个thread不yield,那么它的工作就会一次性地被CPU执行完,而其他thread就没有执行机会,这显然是不好的。

    明白了什么是sos scheduler yield,我们来看看什么导致了scheduler yield。我们已经知道scheduler yield是说一个thread在CPU上疯狂执行直到把自己的这一次的quantum都用完了,也就是说这个thread在执行的过程中需要的所有的resource都是available的,不然它就会进入suspended状态。那么我们想想什么操作会有这样的表现呢?对了就是table scan或者index scan!当一个很大的scan操作需要访问的所有page都在内存并且也不存在page latch无法获得的问题时,这个thread就尽情地scan这些page,但是由于page太多了,quantum用完了都还没有scan完,所以只有忍痛yield CPU等待下一次执行机会。这就是最常见的sos scheduler yield的原因。当然还有其他原因,比如确实是你的CPU不够强大,已经成为系统的瓶颈。但是根据楼主的描述,以前都好着呢,所以这种情况的可能性不大。

    建议检查你的stored procedure,看看有没有big scan,是不是需要创建index来speed up the query。

  • 相关阅读:
    Swift学习一
    Swift开发学习(一):初始篇
    objc_msgSend arm64 崩溃问题
    更改navigationController push和pop界面切换动画
    iOS 改变UITextField中光标颜色
    IOS Core Animation Advanced Techniques的学习笔记(五)
    使用CAShapeLayer与UIBezierPath画出想要的图形
    亮相SIGGRAPH 太极拳三维教学App制作揭秘
    MySQL优化——索引
    求职前一个月复习知识
  • 原文地址:https://www.cnblogs.com/zengkefu/p/7069285.html
Copyright © 2011-2022 走看看