首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2000 UNION 與 UNION ALL 差異實戰解析

     編輯:關於SqlServer

核心差異

運算子行為效能適用場景
UNION合併結果集並 移除重複列(執行 DISTINCT 排序/雜湊)較慢業務需唯一結果集,且重複率低
UNION ALL直接合併結果集,保留所有列(含重複)快(無去重開銷)明確知結果集無重複、或需保留重複、或後續自行處理

實戰案例:關鍵零件生產進度三層匯總

表 Key_Item_Cal 需產出三層報表:明細、一級彙總、二級彙總。若直接用 UNION 串接三個查詢:

-- 明細
SELECT Key_item_name, QTY_RECVD1, Style FROM ...
-- 一級彙總
SELECT Key_item_name, SUM(QTY_RECVD1), MAX(Style) FROM ... GROUP BY Style, Key_item_name
-- 二級彙總
SELECT MAX(Key_item_name), SUM(QTY_RECVD1), Style FROM ... GROUP BY Style

UNION 會對三層結果再做一次全域去重,導致:

  • 明細列與彙總列若碰巧數值相同會被誤刪。
  • 額外排序/雜湊開銷大。

正確做法

  1. 若三層結果在業務語意上本就不重複(如層級不同),直接用 UNION ALL。
  2. 需去重時,改用 UNION 但確認欄位語意,或於外層包一層 SELECT DISTINCT * FROM ( ... UNION ALL ... ) t 明確控制去重範圍。
  3. 搭配 COMPUTE / GROUPING SETS(SQL 2008+)單一查詢產出多層彙總,避免多次掃描。

效能建議

  • 預設優先使用 UNION ALL,除非確定需要去重。
  • 大量資料去重考慮建立臨時表加索引後再 DISTINCT。
  • 檢視執行計畫確認是否出現 Distinct Sort 或 Hash Match (Aggregate) 運算子評估開銷。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved