簡單的解釋和例子

簡單來說:

  • UNION 連線 2 個結果集,同時從結果集中刪除重複項
  • UNION ALL 加入 2 個結果集而不嘗試刪除重複項

很多人犯的一個錯誤就是當他們不需要刪除重複項時使用 UNION。針對大型結果集的額外效能成本可能非常顯著。

什麼時候你可能需要 UNION

假設你需要針對 2 個不同的屬性篩選表,並且已為每個列建立了單獨的非聚簇索引。使用 UNION 可以在保持重複的同時利用兩個索引。

SELECT C1, C2, C3 FROM Table1 WHERE C1 = @Param1
UNION
SELECT C1, C2, C3 FROM Table1 WHERE C2 = @Param2

這簡化了效能調優,因為只需要簡單的索引即可以最佳方式執行這些查詢。你甚至可以通過使用相當少的非聚集索引來提高對源表的整體寫入效能。

什麼時候你可能需要 UNION ALL

假設你仍需要針對 2 個屬性過濾表,但你不需要過濾重複記錄(因為它無關緊要,或者由於你的資料模型設計,你的資料在聯合期間不會產生任何重複)。

SELECT C1 FROM Table1
UNION ALL
SELECT C1 FROM Table2

在建立連線資料的檢視時,這尤其有用,這些檢視旨在跨多個表進行物理分割槽(可能出於效能原因,但仍希望彙總記錄)。由於資料已經拆分,因此使資料庫引擎刪除重複項不會增加任何值,只會為查詢新增額外的處理時間。