Sql-Server
SOS_SCHEDULER_YIELD - 防止 Proc 放棄處理器時間
我有一個過程,大約每月一次,有時不相關(或據我們所知)進入
SOS_SCHEDULER_YIELD
狀態。這個過程阻塞了我們的主要數據輸入管道,並使整個數據庫戛然而止。我們在這個過程前面放置了一個帶有服務代理的隊列表(因為它最初是數據輸入過程),並且由於前面的系統隊列中的空間不足,我們正在失去數據。這阻止了我們失去數據,但並沒有解決問題,它只是一個創可貼。
有沒有辦法在程序中說這個 proc 必須在 CPU 上被賦予更高的優先級,或者必須在列表中的低位才能佔用 CPU 時間,處理器需要 7 分鐘才能回到完成今天的任務(已經 12 分鐘前,似乎是我們承受的負載越高,需要的時間越長,因為有更多的數據進入,所以有更多的程序在爭奪 CPU 時間)
在程序中是不可能做到這一點的。這種等待類型是調度程序的功能。每個 SPID 在處理器上獲得有限的時間 (4ms)。一旦該時間或時間片過去,SPID 就會重新進入等待列表,直到資源再次可用。這種等待類型表明 SPID 無法在量子中完成其在 CPU 上的工作,必須“讓步”給另一個等待程序。
這不能用任何 SQL 程式碼更改。正如 Paul White 建議的那樣,您可以使用 Resource Governor 為您的負載指定資源的優先級。即便如此,除非像 Kin 建議的那樣,您正在經歷很大的 CPU 壓力,否則資源調控器也無濟於事。
檢查 CPU 密集型操作並儘可能減少。咬很多人的是隱式轉換,通過掃描執行計劃很快就會發現。