Sql-Server
優化器如何執行標量函式
我在網上讀到標量函式會影響性能,因為優化器無權訪問標量函式的內容。由於函式是針對每一行執行的,優化器是否必須每次都為函式的內容建構一個執行計劃,或者它是否在第一次訪問該函式時建構該計劃,然後將其用於所有其他行?
對於未內聯的標量 UDF,實際查詢計劃僅生成一次(顯然假設在執行之間沒有統計資訊更新、索引重建或任何 DDL 更改)。該計劃像任何其他查詢計劃一樣被記憶體和重用。
它不會在 中獲取任何數據
sys.dm_exec_query_stats
,因此您無法通過這種方式獲得任何統計資訊。但是你可以sys.dm_exec_function_stats
用來獲取類似的資訊。您可以使用以下查詢查看記憶體的查詢計劃
SELECT p.objtype, OBJECT_NAME(f.object_id), st.text, qp.query_plan, p.refcounts, p.usecounts, f.execution_count FROM sys.dm_exec_function_stats f JOIN sys.dm_exec_cached_plans p ON p.plan_handle = f.plan_handle CROSS APPLY sys.dm_exec_query_plan(p.plan_handle) qp CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) st WHERE f.object_id = OBJECT_ID(N'dbo.fnTest') OPTION(RECOMPILE);
您可以使用Database Scoped Configuration
EXEC_QUERY_STATS_FOR_SCALAR_FUNCTIONS
來打開或關閉此功能(到目前為止,該旋鈕僅適用於 Azure SQL DB 和託管實例)。函式的實際執行確實發生在單獨的範圍內,需要對參數進行編組並前後返回結果,以及上下文切換(
SET
例如不同的選項和不同的局部變數範圍)。這是他們表現如此糟糕的主要原因之一。