爲什麼查詢版本2如此之快?爲什麼當我(手動)將表值函數的結果緩存在臨時表中時,查詢執行速度會如此之快?
我懷疑DB引擎多次調用表值函數「GetUsageStatistic」,那麼有沒有辦法告訴引擎「GetUsageStatistic」是確定性的,應該只調用一次?
查詢版本1
--Takes ~10 minutes
select *
from RosterLevel r
left join GetUsageStatistics(@mindate, @maxdate) usage on r.UserID = usage.UserID;
查詢版本2
--Takes ~10 seconds
select * into #usage from GetUsageStatistics(@mindate, @maxdate);
select *
from RosterLevel r
left join #usage on r.UserID = #usage.UserID;
'GetUsageStatistics'的外觀是什麼樣的?它是單個查詢還是多個查詢導致單個結果集? – 2011-06-02 21:43:44
GetUsageStatistics是一個內聯表值函數(ITVF),它從GetWeeklyUsage中進行選擇,GetWeeklyUsage本身就是一個從GetDailyUsage(也是ITVF)中進行選擇的ITVF。它基本上是一個確定性ITVF的簡單鏈,每個鏈都會在其輸出列中返回SUM,AVG和COUNT函數的聚合結果的級別。 – Triynko 2011-06-02 21:48:53
@Triynko - 絕對值得兩個查詢的實際執行計劃,並比較它們,看看您的多次執行TVF理論是否正確。 – 2011-06-02 21:50:20