2015-12-11 61 views
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 

在真實環境中會更復雜的查詢,這些只是簡單的版本供其他人閱讀

問題:

  1. 基於性能和冗餘性,使用CTE代替每次使用JOIN會更好嗎?

  2. 有沒有更好的辦法做到這一點,甚至UNION ALL查詢以外的這些方式。

+0

檢查您的查詢計劃。我的猜測是,CTE將被摺疊以同時提供相同的查詢計劃,但要確保檢查它。 –

+0

對於這兩種查詢類型,查詢計劃結果給出的代價非常小,即使時間消耗也幾乎不明顯。可能會離開它或切換到真實環境進行測試。如果出現性能問題,請進一步調整。無論如何.. – Dean

+2

CTE的行爲像macro.CTE是可讀性好,但它的表現並不比臨時表更好使用臨時表,如果可能的話。如果您要連接多個表,並且每個表中都有數百萬行記錄,則CTE的性能將顯着低於臨時表。 –

回答

0

我不認爲在你的情況下,CTE和JOIN會有什麼大的區別。 SQL Server優化會將其轉換爲完全不同的東西,這兩個查詢可能會產生相同的結果。如果選擇性很高,您可以嘗試在TotalAmount和Quantity上添加索引。

+0

關於使用索引的好處,虐待它進一步調整..謝謝任何地方 – Dean