更改為兼容級別 150 會使 SQL Server 消耗所有可用記憶體
我們正在將現有數據庫移動到新的 SQL Server 2019 實例。
如果我們將兼容級別更改為 150,則沒有任何效果。任務管理器顯示 sql server 服務正在消耗所有可用記憶體並且所有查詢都超時並顯示錯誤
內部資源池中的系統記憶體不足,無法執行此查詢
RAM 被完全消耗,直到無法執行任何查詢(所有這些都以我之前提到的錯誤結束)。我們嘗試了 16、32 和 64GB 的 RAM。
任何人都可以提供有關如何調試的任何提示嗎?
請注意,這不是查詢問題……僅更改兼容級別就足以使 SQL 開始耗盡記憶體。
即使執行一個簡單的標量函式(內部使用多個 Substring 和 cast 呼叫 - 沒有表或視圖選擇)也足以使其消耗所有可用記憶體。
您遇到了標量 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;
或者在查詢級別,如我之前連結到的文件文章中所述。