L'UDF est une boîte noire pour l'optimiseur de requête, il est donc exécuté pour chaque ligne. Vous faites un curseur ligne par ligne. Pour chaque ligne d'un élément, recherchez un identifiant trois fois dans une autre table. Cela se produit lorsque vous utilisez des UDF scalaires ou multi-instructions (les UDF en ligne sont simplement des macros qui se développent dans la requête externe)
L'un des nombreux articles sur le problème est "Fonctions scalaires, inlining et performances :un titre divertissant pour un article ennuyeux".
Les sous-requêtes peuvent être optimisées pour corréler et éviter les opérations ligne par ligne.
Ce que vous voulez vraiment, c'est ceci :
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
Mise à jour février 2019
SQL Server 2019 commence à résoudre ce problème.