Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum ist eine UDF so viel langsamer als eine Unterabfrage?

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.