¿Por qué es Query Version 2 mucho más rápido?¿Por qué una consulta se ejecuta mucho más rápido cuando yo (manualmente) almacena en caché los resultados de una función con valores de tabla en una tabla temporal?
Sospecho que el motor de base de datos está llamando a la función de valor de tabla "GetUsageStatistic" varias veces, ¿hay alguna manera de decirle al motor que "GetUsageStatistic" es determinista y debe llamarse solo una vez?
Consultar la versión 1
--Takes ~10 minutes
select *
from RosterLevel r
left join GetUsageStatistics(@mindate, @maxdate) usage on r.UserID = usage.UserID;
Query versión 2
--Takes ~10 seconds
select * into #usage from GetUsageStatistics(@mindate, @maxdate);
select *
from RosterLevel r
left join #usage on r.UserID = #usage.UserID;
¿Cómo es el cuerpo de 'GetUsageStatistics'? ¿Es una consulta única o varias consultas que conducen a un único conjunto de resultados? –
GetUsageStatistics es una función de valor de tabla en línea (ITVF), que selecciona de GetWeeklyUsage, que a su vez es una ITVF que selecciona de GetDailyUsage (también una ITVF). Básicamente es una cadena simple de ITVF deterministas que devuelven un nivel de resultados agregados con funciones SUM, AVG y COUNT en sus columnas de salida. – Triynko
@Triynko - definitivamente vale la pena obtener Planes de ejecución reales para ambas consultas y compararlas para ver si su ejecución múltiple de la teoría TVF es correcta. –