[转]T-SQL Optimization Tips (1): UNION & DISTINCT
UNION用于“将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部行。”
假设有两个记录集A和B,A和B进行UNION运算的过程和下面的描述是等价的:
图 UNION的等价过程
即使上图中的记录集A和B两者不存在相同的记录,由于SQL Server无法预知两者是否存在相同的记录项,UNION运算还是会“忠实”执行SELECT DISTINCT操作。
DISTINCT关键字用于“关键字可从SELECT 语句的结果中除去重复的行”,它会为SQL Server带来大量额外运算,如果非必须应当避免使用该关键字。
那么,当我们确知记录集A和B之间不存在重复的记录项时(确定的业务逻辑可能会给我们这方面的信心),我们可以使用UNION ALL来“代替”UNION以减少操作从而提高T-SQL的效率。
其实,并不是“代替”:关键字UNION是运算符,而ALL是UNION运算的一个可选选项,使用该选项,会“在结果中包含所有的行,包括重复行。如果没有指定,则删除重复行。”
DOS & DONTS——
1、避免使用DISTINCT;
2、使用UNION代替UNION ALL;
[注意:为了引起注意,所有本系列总结的DOS & DONTS都是具有一定前提的,一般的前提是“除非必要”和“除非必要才不”。]