我有一个过程,大约每月一次,有时不相关(或据我们所知)进入SOS_SCHEDULER_YIELD
状态。这个过程阻塞了我们的主要数据输入管道,并使整个数据库戛然而止。
我们在这个 proc 前面放置了一个带有服务代理的队列表(因为它最初是数据输入 proc)并且我们正在丢失数据,因为前面的系统在他们的队列中用完了空间。这防止了我们丢失数据,但并没有解决问题,它只是一个创可贴。
程序中是否有任何方法可以说明此过程必须在 CPU 上获得更高的优先级,或者必须在列表中处于低位以占用 CPU 时间,处理器需要 7 分钟才能完成今天的任务(12 分钟前,似乎是我们承受的负载越高,它花费的时间越长,因为有更多的数据进入,所以有更多的进程争夺 CPU 时间)
在程序中不可能这样做。这种等待类型是调度程序的一个功能。每个 SPID 在处理器上获得有限的时间 (4ms)。一旦该时间或量程过去,SPID 将被放回等待列表,直到资源再次可用。这种等待类型表明 SPID 无法在 quantum 中完成其在 CPU 上的工作,必须“让步”给另一个等待进程。
这不能用任何 SQL 代码更改。正如 Paul White 所建议的,您可以使用 Resource Governor 为您的负载指定资源的优先级。即便如此,除非像 Kin 所建议的那样,您遇到了很大的 CPU 压力,否则 Resource Governor 也无济于事。
检查 CPU 密集型操作并尽可能减少。咬很多人的一个是隐式转换,通过扫描执行计划很快就会发现它。
首先检查是否
现在,如果它是导致您出现问题的唯一等待类型,
始终测试并确保您使用的是最新的服务包和 CU