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。

  • 相关阅读:
    String.valueOf()方法的使用
    springMVC中ModelAndView学写笔记
    赛邮云通信
    DOS命令
    完全二叉树一维数组存放的结点相关关系
    Float与二进制之间的转化(Java实现)
    碎片知识1
    hashtable——散列表
    Huffman Tree
    Unable to update the EntitySet 'T_JsAPI' because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element to support the current operation.
  • 原文地址:https://www.cnblogs.com/zengkefu/p/7069285.html
Copyright © 2011-2022 走看看