sql >> Base de Datos >  >> RDS >> Sqlserver

¿Por qué una UDF es mucho más lenta que una subconsulta?

El UDF es un cuadro negro para el optimizador de consultas, por lo que se ejecuta para cada fila. Está haciendo un cursor de fila por fila. Para cada fila de un activo, busque una identificación tres veces en otra tabla. Esto sucede cuando usa UDF escalares o de declaraciones múltiples (los UDF en línea son simplemente macros que se expanden en la consulta externa)

Uno de los muchos artículos sobre el problema es "Funciones escalares, interlineado y rendimiento:un título entretenido para una publicación aburrida".

Las subconsultas se pueden optimizar para correlacionar y evitar las operaciones fila por fila.

Lo que realmente quieres es esto:

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

Actualización de febrero de 2019

SQL Server 2019 comienza a solucionar este problema.