Ho una domanda che sembraPerché l'inserimento e il join delle tabelle #temp è più veloce?
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 ha ~ 5000 righe A e B ~ 4000 righe ciascuna
Questa query ha un tempo di esecuzione di prestazioni ~ 10 + minuti.
La modifica a questo però:
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')
ha una prestazione di ~ 4 secondi.
Questo non ha molto senso, come sembrerebbe il costo da inserire in una tabella temporanea e quindi il join dovrebbe essere più alto di default. La mia inclinazione è che SQL stia facendo il tipo sbagliato di "join" con la subquery, ma forse l'ho perso, non c'è modo di specificare il tipo di join da usare con sottoquery correlate.
C'è un modo per ottenere ciò senza utilizzare le tabelle #temp/@ variabili di tabella tramite indici e/o suggerimenti?
MODIFICA: si noti che dbo.TableReturningFunc1 e dbo.TableReturningFunc2 sono in linea TVF, non multi-statement o sono istruzioni di visualizzazione "parametrizzate".
Come posso ottenere questo risultato senza fare in modo esplicito la tabella temporanea, se possibile? –
Certo che è possibile, vedere l'aggiornamento post – Quassnoi
Prestazioni con CTE 1:28, metodo tabella temporanea 0:04. Molto meglio di 10+ minuti ... ma ancora ordini di grandezza in differenza. –