Sql-Server

SQL Server CLR 過程和 SQLCLR_QUANTUM_PUNISHMENT

  • May 12, 2019

我有一個在 SQL Server 2014 上執行的 CLR 儲存過程。這個儲存過程收集一些數據(通常在數万行範圍內編號),對數據執行一些計算,生成輸出數據集,並寫入該輸出數據集到幾個目標表。對於小型執行,這需要幾秒鐘。對於我們較大的執行,目前大約需要 25 分鐘。在這 25 分鐘內,我們觀察到大量的 SQLCLR_QUANTUM_PUNISHMENT 等待。因此,我試圖讓自己了解我們可以做些什麼來減少這些等待的發生。我發現大量資源告訴我,“當 CLR 任務因超出其執行量而受到限制時發生。這種限制是為了減少此資源密集型任務對其他任務的影響。” 和我’ 讀到 SQL Server 的執行時間是 4ms。那麼我是否假設任何時候 CLR 儲存過程或函式佔用超過 4ms 的 CPU 時間,都會發生這種等待類型?

另外,我發現一個參考表明一些 CLR 過程應該是 yielding。現在,我們的 CLR 過程是單執行緒的。我當然可以在關鍵位置添加一些睡眠呼叫,看看會產生什麼樣的影響。但我想更好地了解正在發生的事情。因此,如果有人有一些好的知識可以分享或有一個好的文件/文章的連結,我將不勝感激。在 BOL 報價之外查找有關此等待類型的資訊有點困難。

不幸的是,關於這個主題的資訊並不多。我可以說是的,你當然應該Thread.Sleep(0);在你的程式碼中添加到不同的地方。這樣做使 SQL Server 有機會控制執行緒。這在進行數據訪問(即東西)的地方是不必要的,SqlClient因為 SQL Server 已經有能力管理它。

此外,@Remus Rusanu 在另一個問題(可能在 Stack Overflow 上)建議使用Thread.BeginThreadAffinity / Thread.EndThreadAffinity來管理長時間執行的程序,但使用這些要求將 Assembly 設置為UNSAFE.

引用自:https://dba.stackexchange.com/questions/164891