Die UDF ist eine Blackbox für den Abfrageoptimierer, daher wird sie für jede Zeile ausgeführt. Sie machen einen Zeile-für-Zeile-Cursor. Schlagen Sie für jede Zeile in einem Asset dreimal eine ID in einer anderen Tabelle nach. Dies geschieht, wenn Sie skalare UDFs oder UDFs mit mehreren Anweisungen verwenden (Inline-UDFs sind einfach Makros, die in die äußere Abfrage erweitert werden)
Einer von vielen Artikeln zu diesem Problem ist "Skalarfunktionen, Inlining und Leistung:Ein unterhaltsamer Titel für einen langweiligen Beitrag".
Die Unterabfragen können optimiert werden, um die zeilenweisen Operationen zu korrelieren und zu vermeiden.
Was Sie wirklich wollen, ist Folgendes:
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
Update Februar 2019
SQL Server 2019 beginnt, dieses Problem zu beheben.