Sql-Server

優化器如何執行標量函式

  • November 5, 2021

我在網上讀到標量函式會影響性能,因為優化器無權訪問標量函式的內容。由於函式是針對每一行執行的,優化器是否必須每次都為函式的內容建構一個執行計劃,或者它是否在第一次訪問該函式時建構該計劃,然後將其用於所有其他行?

對於未內聯的標量 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 ConfigurationEXEC_QUERY_STATS_FOR_SCALAR_FUNCTIONS來打開或關閉此功能(到目前為止,該旋鈕僅適用於 Azure SQL DB 和託管實例)。


函式的實際執行確實發生在單獨的範圍內,需要對參數進行編組並前後返回結果,以及上下文切換(SET例如不同的選項和不同的局部變數範圍)。這是他們表現如此糟糕的主要原因之一。

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