Perché la Query versione 2 è molto più veloce?Perché una query viene eseguita molto più rapidamente quando memorizzo (manualmente) i risultati di una funzione con valori di tabella in una tabella temporanea?
Sospetto che il DB Engine stia chiamando la funzione con valori di tabella "GetUsageStatistic" più volte, quindi c'è un modo per dire al motore che "GetUsageStatistic" è deterministico e dovrebbe essere chiamato una sola volta?
Query versione 1
--Takes ~10 minutes
select *
from RosterLevel r
left join GetUsageStatistics(@mindate, @maxdate) usage on r.UserID = usage.UserID;
Query versione 2
--Takes ~10 seconds
select * into #usage from GetUsageStatistics(@mindate, @maxdate);
select *
from RosterLevel r
left join #usage on r.UserID = #usage.UserID;
Che aspetto ha il corpo di 'GetUsageStatistics'? È una singola query o più query che portano a un singolo set di risultati? –
GetUsageStatistics è una funzione a valore di tabella inline (ITVF), che seleziona da GetWeeklyUsage, che è esso stesso un ITVF che seleziona da GetDailyUsage (anche un ITVF). È fondamentalmente una semplice catena di ITVF deterministici che restituiscono ciascun livello di risultati aggregati con le funzioni SUM, AVG e COUNT nelle colonne di output. – Triynko
@Triynko: vale sicuramente la pena ottenere piani di esecuzione effettivi per entrambe le query e confrontarli per verificare se la tua esecuzione a più riprese della teoria TVF sia corretta. –