0
我有兩種與做同樣的工作,在這裏T-SQL UNION性能問題
查詢1查詢:
SELECT MP.MemberName FROM MemberProfile MP
LEFT JOIN Order O ON MP.MemberID = O.MemberID
WHERE O.TotalAmount >= 100
UNION
SELECT MP.MemberName FROM MemberProfile MP
LEFT JOIN Order O ON MP.MemberID = O.MemberID
WHERE O.Quantity >= 10
查詢2:
;WITH cte AS (
SELECT MP.MemberName, O.Quantity, O.TotalAmount FROM MemberProfile MP
LEFT JOIN Order O ON MP.MemberID = O.MemberID
)
SELECT MemberName FROM cte WHERE TotalAmount >= 100
UNION
SELECT MemberName FROM cte WHERE Quantity >= 10
在真實環境中會更復雜的查詢,這些只是簡單的版本供其他人閱讀
問題:
基於性能和冗餘性,使用CTE代替每次使用JOIN會更好嗎?
有沒有更好的辦法做到這一點,甚至UNION ALL查詢以外的這些方式。
檢查您的查詢計劃。我的猜測是,CTE將被摺疊以同時提供相同的查詢計劃,但要確保檢查它。 –
對於這兩種查詢類型,查詢計劃結果給出的代價非常小,即使時間消耗也幾乎不明顯。可能會離開它或切換到真實環境進行測試。如果出現性能問題,請進一步調整。無論如何.. – Dean
CTE的行爲像macro.CTE是可讀性好,但它的表現並不比臨時表更好使用臨時表,如果可能的話。如果您要連接多個表,並且每個表中都有數百萬行記錄,則CTE的性能將顯着低於臨時表。 –