ジーンは間違いなく一度だけコンパイルされます。
次のクエリは、読み込み、あなたのプロシージャキャッシュを与えると、そのような実行回数として有用なメトリックが含まれますなど:
私は実行に機能はでは1よりも高いカウント見ることができる午前レポートで
SELECT TOP 1000 DB_NAME(qt.dbid) AS DB,
OBJECT_NAME(qt.objectid, qt.dbid) AS 'object_name',
qs.total_worker_time,
qs.execution_count,
qs.total_logical_reads,
plan_generation_num,
SUBSTRING(qt.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2) + 1) AS 'query'
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
LEFT JOIN sys.objects o
ON o.object_id = qt.objectid
WHERE qs.execution_count > 0
AND DATEDIFF(Second, qs.creation_time, GETDATE()) > 0
AND DATEDIFF(Minute, qs.creation_time, GETDATE()) > 0
ORDER BY /*Sort functions first*/
CASE
WHEN o.type_desc LIKE '%FUNCTION' THEN 0
ELSE 1
END,
qs.execution_count DESC
つまり、既存の実行計画が再利用されます。ストアドプロシージャと同じ動作です。
出典
2013-12-10 21:13:09
xav
私はUDFの推定行数が常に1であることを知っています... –
彼らは間違っています。 UDFは呼び出されるたびに再コンパイルされません。これは多くの方法を証明することが可能です。例えばプロファイラでイベントをトレース(再)し、DMVをキャッシュするプランを見てください。 [私の答えはこちら](http://stackoverflow.com/questions/19884138/why-sql-functions-are-faster-than-udf/19891697#19891697)は、UDFを複数回実行するとスタックトレースを調べます。オーバーヘッドはコンパイルではなく実行中です。 –
どのような種類の関数 - スカラーまたはインラインのテーブル値またはマルチステートメントのテーブル値ですか?3つは、実行メカニズムの異なるオブジェクトの種類です(インラインTVFはインライン展開されています:-)。 –