Sql-Server
儲存過程使用的 UDF 是否在 SP 本身中進行了優化/合併?
這個問題讓我發瘋了幾天,我可能已經找到了答案,但我需要確認並檢查最終的簡單解決方案。
當儲存過程使用一些使用者定義的函式時,UDF 計劃是合併到主計劃中並且一切都得到優化還是每次都直接呼叫?
假設它沒有發生,有沒有辦法強制 SQL Server 為特定的 SP 做這件事?
如果我正確理解了這個問題,它應該取決於函式的類型。內聯表值函式將其定義替換為引用查詢,就像視圖發生的情況一樣。這就是“內聯”的含義,以及為什麼它們不是可以簽名的真正模組,以及與其他函式類型的其他差異。
多語句表值函式和標量使用者定義函式是完全獨立的模組,分別執行並有自己的計劃。
此行為與它們在儲存過程或臨時查詢中被引用無關。
現在,是否每次都呼叫 UDF,這取決於 UDF 的類型:
- T-SQL UDF 按行執行並阻止並行計劃
- SQLCLR UDF,如果它們被標記為
IsDeterministic=true;
(false
預設情況下)並且沒有進行任何數據訪問,則不會阻止並行計劃並且應該能夠記憶體它們的返回值(我假設每個查詢執行)。這就是為什麼盡可能將 T-SQL UDF 轉換為 T-SQL 內聯 TVF 的原因。