简单的解释和例子

简单来说:

  • 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

在创建连接数据的视图时,这尤其有用,这些视图旨在跨多个表进行物理分区(可能出于性能原因,但仍希望汇总记录)。由于数据已经拆分,因此使数据库引擎删除重复项不会增加任何值,只会为查询添加额外的处理时间。