Update

SQL Server 2019 UPDATE 語句 SET to function 不會為每一行再次執行該函式

  • July 23, 2020

這是場景。我有一個本地 SQL Server,我已將實時 SQL Server 數據庫恢復到該本地 SQL Server。為了符合 GDPR/CCPA,我必須匿名化本地伺服器數據庫中的 PII。我有一個腳本來執行此操作,當本地伺服器是 2008 R2 或 2017 時,它一直執行良好。但我剛剛安裝了 2019,並且相同的腳本在表的每一行中放置了相同的值,而不是不同的值對於每一行。就好像函式只執行一次,然後在UPDATE語句中使用該值。也許這是 2019 年正在做的某種優化?這是腳本的一個片段。

UPDATE Guest SET GuestFirstName=Utility.dbo.RANDWORD() WHERE GuestFirstName IS NOT NULL;

RANDWORD從包含大約 100,000 個英語單詞的表中抓取一個隨機單詞。

我懷疑這是因為 SQL 2019 的一個新功能,標量 UDF 內聯

使用此新功能,標量 UDF 會自動轉換為標量表達式或標量子查詢,在呼叫查詢中替換 UDF 運算符。然後優化這些表達式和子查詢。因此,查詢計劃將不再具有使用者定義的函式運算符,但其效果將在計劃中觀察到,如視圖或內聯 TVF。

這可能會帶來性能優勢,但在您的情況下,它似乎只處理該函式一次,然後將相同的結果應用於每一行。

連結文章的底部描述了禁用標量 UDF 內聯的幾種方法。

您可以按數據庫禁用它:

ALTER DATABASE SCOPED CONFIGURATION SET TSQL_SCALAR_UDF_INLINING = OFF;

或者使用提示強制此選項逐個查詢:

OPTION (USE HINT('DISABLE_TSQL_SCALAR_UDF_INLINING'));

或者您可以通過更改 UDF 本身來禁用它:

WITH INLINE = OFF

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