Sql-Server

儲存過程使用的 UDF 是否在 SP 本身中進行了優化/合併?

  • September 13, 2018

這個問題讓我發瘋了幾天,我可能已經找到了答案,但我需要確認並檢查最終的簡單解決方案。

當儲存過程使用一些使用者定義的函式時,UDF 計劃是合併到主計劃中並且一切都得到優化還是每次都直接呼叫?

假設它沒有發生,有沒有辦法強制 SQL Server 為特定的 SP 做這件事?

如果我正確理解了這個問題,它應該取決於函式的類型。內聯表值函式將其定義替換為引用查詢,就像視圖發生的情況一樣。這就是“內聯”的含義,以及為什麼它們不是可以簽名的真正模組,以及與其他函式類型的其他差異。

多語句表值函式和標量使用者定義函式是完全獨立的模組,分別執行並有自己的計劃。

此行為與它們在儲存過程或臨時查詢中被引用無關。

現在,是否每次都呼叫 UDF,這取決於 UDF 的類型:

  • T-SQL UDF 按行執行並阻止並行計劃
  • SQLCLR UDF,如果它們被標記為IsDeterministic=true;false預設情況下)並且沒有進行任何數據訪問,則不會阻止並行計劃並且應該能夠記憶體它們的返回值(我假設每個查詢執行)。

這就是為什麼盡可能將 T-SQL UDF 轉換為 T-SQL 內聯 TVF 的原因。

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