Tengo una consulta que se parece a¿Por qué es más rápido insertar y unir tablas #temp?
SELECT
P.Column1,
P.Column2,
P.Column3,
...
(
SELECT
A.ColumnX,
A.ColumnY,
...
FROM
dbo.TableReturningFunc1(@StaticParam1, @StaticParam2) AS A
WHERE
A.Key = P.Key
FOR XML AUTO, TYPE
),
(
SELECT
B.ColumnX,
B.ColumnY,
...
FROM
dbo.TableReturningFunc2(@StaticParam1, @StaticParam2) AS B
WHERE
B.Key = P.Key
FOR XML AUTO, TYPE
)
FROM
(
<joined tables here>
) AS P
FOR XML AUTO,ROOT('ROOT')
P ~ tiene 5000 filas A y B ~ 4000 filas cada
Esta consulta tiene un rendimiento de ejecución de ~ 10 + minutos.
Si lo cambia a esto, sin embargo:
SELECT
P.Column1,
P.Column2,
P.Column3,
...
INTO #P
SELECT
A.ColumnX,
A.ColumnY,
...
INTO #A
FROM
dbo.TableReturningFunc1(@StaticParam1, @StaticParam2) AS A
SELECT
B.ColumnX,
B.ColumnY,
...
INTO #B
FROM
dbo.TableReturningFunc2(@StaticParam1, @StaticParam2) AS B
SELECT
P.Column1,
P.Column2,
P.Column3,
...
(
SELECT
A.ColumnX,
A.ColumnY,
...
FROM
#A AS A
WHERE
A.Key = P.Key
FOR XML AUTO, TYPE
),
(
SELECT
B.ColumnX,
B.ColumnY,
...
FROM
#B AS B
WHERE
B.Key = P.Key
FOR XML AUTO, TYPE
)
FROM #P AS P
FOR XML AUTO,ROOT('ROOT')
tiene un rendimiento de ~ 4 segundos.
Esto no tiene mucho sentido, ya que parece que el costo de insertar en una tabla temporal y luego hacer la unión debería ser mayor de forma predeterminada. Mi inclinación es que SQL está haciendo un tipo incorrecto de "unirse" a la subconsulta, pero tal vez me lo he perdido, no hay forma de especificar el tipo de combinación para usar con las subconsultas correlacionadas.
¿Hay alguna manera de lograr esto sin utilizar las tablas #temp/@ table variables mediante índices y/o sugerencias?
EDITAR: Tenga en cuenta que dbo.TableReturningFunc1 y dbo.TableReturningFunc2 son TVF en línea, no multi declaraciones, o son declaraciones de vista "parametrizadas".
¿Cómo podría lograr esto sin hacer la tabla temporal de trabajo explícitamente, si es posible? –
Claro que es posible, consulte la actualización de la publicación – Quassnoi
Rendimiento con CTE 1:28, método de la tabla Temp 0:04. Mucho mejor que 10+ minutos ... pero aún órdenes de magnitud en la diferencia. –