我有兩個(相當複雜的)函數都返回一個表;SQL Server:加入2個查詢,性能問題
(SELECT Id, x, y FROM fnGetXY(3)) (execution takes +/- 5 sec)
(SELECT Id, a, b FROM fnGetAB(3)) (execution takes +/- 15 sec)
我想合併結果;
SELECT X.Id, x, y, a, b FROM
(
(SELECT Id, x, y FROM fnGetXY(3)) X
JOIN (SELECT Id, a, b FROM fnGetAB(3)) Y ON X.Id=Y.Id
)
的結果是正確的,但是這不採取預期的+/- 20-25秒,但90秒。
有什麼辦法可以強制兩個查詢的結果組合的方式消耗的最大值略大於每個的總和?
[更新]
- #TEMP;由於這是函數的一部分,不幸的是#temp表不是一個選項。
- 我已經試過LEFT JOIN,而不是沒有結果,但似乎FULL OUTER JOIN解決了這一JOIN的情況下..
謝謝大家!
只是出於好奇,爲什麼要將返回的結果集添加到臨時表? –
出於經驗:)嚴重的是,我必須處理由TVF引起的太多性能問題,這種方法似乎有所幫助。 – dean
我很好奇。我經常發現,在處理非常大的TB大小的數據庫時,使用臨時表存儲中間結果的速度可能比將所有數據全部集中在一起快一個數量級。我可以理解執行計劃人員與大量散列連接等混淆,但它仍然與直覺相反,即一旦數據庫一次可以訪問整個數據,DB就處於最佳狀態,而不是基於循環的方法基本的Java/C#等等。這就像一個小例外。 – Kahn