KB4040276 - 修正:在 SQL Server 2016 和 2017 中,tempdb 資料庫上的間接檢查點會造成「Non-yielding scheduler」錯誤

Applies To
SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2016 Service Pack 1 SQL Server 2017 on Windows (all editions)

症狀

預設情況下,Microsoft SQL Server 2016 和 2017 中的 tempdb 資料庫的間接檢查點已開啟。 在繁重工作負載條件下,可能會發生「非讓路排程器」錯誤,並且sys.dm_os_spinlock_stats DMV 顯示DP_LIST執行緒同步鎖定類型的執行緒鎖定爭用較高。

解決方式

此修正程式包含在下列更新和 Service Pack 中:

SQL Server 2016 的 Service Pack 資訊

適用於 SQL Server 2016 的 Service Pack 2

關於 SQL Server 組建

SQL Server 的每個新組建都包含前一個組建中的所有 Hotfix 和安全性修正程式。 建議您安裝 SQL Server 的最新累積更新:

適用於 SQL Server 2017 的最新累積更新

適用於 SQL Server 2016 的最新組建

關於 SQL Server Service Pack:

Service Pack 是累積性的。 每個新版 Service Pack 都包含前一版 Service Pack 中所有的修正程式,以及任何新增的修正程式。 我們的建議是套用最新的 Service Pack 和該 Service Pack 的最新累積更新。 所以在安裝最新版的 Service Pack 之前,您不需要安裝前一版的 Service Pack。 使用下列文章中的「表 1」,尋找有關最新 Service Pack 和最新累積更新的詳細資訊。

如何判斷 SQL Server 及其元件的版本、版次及更新層級

因應措施

若要解決此問題,請使用下列其中一種資料定義語言 (DDL) 陳述式來關閉 tempdb 資料庫上的間接檢查點。

這應該按照以下方式完成:

  • 在 modeldb 資料庫上 (這也會變更新資料庫的預設值) ,請執行下列語句:

    ALTER DATABASE [model] SET TARGET_RECOVERY_TIME = 0 MINUTES

  • 或者,每次使用 SQL Server Agent 啟動執行個體時,直接在 tempdb 資料庫上,使用下列語句:

    ALTER DATABASE [tempdb] SET TARGET_RECOVERY_TIME = 0 MINUTES

  • 或者,使用下列語句定期對 tempdb 資料庫發出手動檢查點:

    use tempdb
    go checkpoint
    go
     
    此外, TF 3468 可用來停用 tempdb 上的間接檢查點。

狀態

Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。

參考資料

了解 Microsoft 用來說明軟體更新的術語。 如需詳細資訊,請參閱下列文章: