UDFはクエリオプティマイザーのブラックボックスであるため、すべての行に対して実行されます。行ごとのカーソルを実行しています。アセットの各行について、別のテーブルでIDを3回検索します。これは、スカラーまたはマルチステートメントUDFを使用する場合に発生します(インラインUDFは、外部クエリに展開される単なるマクロです)
この問題に関する多くの記事の1つは、「スカラー関数、インライン化、およびパフォーマンス:退屈な投稿の面白いタイトル」です。
サブクエリは、行ごとの操作を相互に関連付けて回避するように最適化できます。
あなたが本当に欲しいのはこれです:
SELECT
uc.id AS creator,
uu.id AS updater,
uo.id AS owner,
a.[name]
FROM
asset a
JOIN
user uc ON uc.user_pk = a.created_by
JOIN
user uu ON uu.user_pk = a.updated_by
JOIN
user uo ON uo.user_pk = a.owned_by
2019年2月の更新
SQLServer2019はこの問題の修正を開始します。