10

¿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; 
+0

¿Cómo es el cuerpo de 'GetUsageStatistics'? ¿Es una consulta única o varias consultas que conducen a un único conjunto de resultados? –

+0

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

+0

@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. –

Respuesta

1

Como se ha mencionado en los comentarios, la mejor respuesta es analizar cualquier plan de ejecución se escupió. Salvo eso, tu intuición es probablemente correcta, pero aparte de cualquier almacenamiento en caché que SQL Server intente automáticamente, no se me ocurren muchas sugerencias de consulta que puedas proporcionar para indicar que la función es determinista, pero puedes intentarlo. algunas cosas mencionadas en el Query Hints MSDN page. Mis primeras pruebas probablemente se basarán en Table Hints.

+0

¿La etiqueta "SQL" es una etiqueta de Microsoft? – Tim

+1

@Tim: No. Sin embargo, muchas personas parecen confundirlo por serlo, de hecho. Otra razón para suponer que SQL Server podría ser que el script del OP es obviamente T-SQL (de '#' -names). Pero probablemente la razón real es que el OP ha mencionado SSMS en uno de sus comentarios. –

+0

@Tim: @Andriy tipo de derecho: "obvio" es un tema, ya que solo se aplica a personas que ya saben a qué se parece TSQL, y que SSMS es MS. Pero aparte de ese esnobismo :-), tienes razón, esta no es una pregunta general de SQL, es una pregunta de TSQL, y eso hace una diferencia en cuanto a quién puede responderla, y quién estaría interesado en buscarla/leer en primer lugar. – Chains

0

Si usa la función en su primer ejemplo, se llama muchas veces, una para cada registro en su tabla RosterLevel. Devuelve una tabla (potencialmente) diferente cada vez, dependiendo del campo de combinación.

Si utiliza la función en su segundo ejemplo, solo se llama una vez. A partir de ahí, la variable de tabla está en la memoria y no tendrá que leer una y otra vez.

Cuestiones relacionadas