Sql-Server

更改為兼容級別 150 會使 SQL Server 消耗所有可用記憶體

  • February 23, 2020

我們正在將現有數據庫移動到新的 SQL Server 2019 實例。

如果我們將兼容級別更改為 150,則沒有任何效果。任務管理器顯示 sql server 服務正在消耗所有可用記憶體並且所有查詢都超時並顯示錯誤

內部資源池中的系統記憶體不足,無法執行此查詢

RAM 被完全消耗,直到無法執行任何查詢(所有這些都以我之前提到的錯誤結束)。我們嘗試了 16、32 和 64GB 的 RAM。

任何人都可以提供有關如何調試的任何提示嗎?

請注意,這不是查詢問題……僅更改兼容級別就足以使 SQL 開始耗盡記憶體。

即使執行一個簡單的標量函式(內部使用多個 Substring 和 cast 呼叫 - 沒有表或視圖選擇)也足以使其消耗所有可用記憶體。

您遇到了標量 UDF 內聯的已知錯誤。您可以使用此處的一種方法禁用內聯(或使用較低的兼容級別,正如您自己發現的那樣):

在不更改兼容性級別的情況下禁用標量 UDF 內聯

或者安裝 CU2 進行永久修復。


…即使執行一個簡單的標量函式(內部使用多個子字元串和強制轉換呼叫 - 沒有表或視圖選擇)也足以使其消耗所有可用記憶體…

閱讀您問題的這一部分讓我想起了來自 sqL_handLe 的這篇非常有趣的部落格文章:

SQL Server 2019 標量 UDF 內聯 - 在某些情況下會出現 OOM

他展示了一個標量 UDF,它不進行任何數據訪問,但會用完盒子上的所有記憶體(即使是一個幾乎 TB 的 RAM):

不只是自己崩潰。在嘗試分配記憶體的實例上崩潰任何其他查詢(例如,竊取查詢記憶體授權)。

這應該在SQL Server 2019 CU2中修復,看起來這是它的 KB:

修復:SQL Server 2019 中的標量 UDF 內聯問題

對於使用標量 UDF 內聯的查詢可能返回錯誤或意外結果的情況,此累積更新包括以下領域的多項修復:

  • 由於非常大的標量 UDF 導致記憶體不足和記憶體洩漏

如果由於某種原因無法安裝 CU2,只要在數據庫級別禁用標量 UDF 內聯,就可以使用更新的兼容級別,如下所示:

ALTER DATABASE SCOPED CONFIGURATION SET TSQL_SCALAR_UDF_INLINING = OFF;

或者在查詢級別,如我之前連結到的文件文章中所述。

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