Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi une UDF est-elle tellement plus lente qu'une sous-requête ?

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.