SQL Server中UNION和UNION ALL的性能比较

28

我需要在多个表中运行一个SELECT语句。我确定这些表会返回不同的记录。不过我仍然使用UNION ALL。

在性能方面,当我确定这些表会返回不同的记录时,是使用UNION还是UNION ALL更好?


可能是重复的问题:联合还是联合全部,这是个问题 - Lukas Eder
6个回答

44

5

UNION ALL 总是更快,因为 UNION 会排除重复的条目。


3
并不总是更快。我正在进行一些性能调整,发现 UNION 操作比 UNION ALL 操作快了近一倍,尽管两种操作返回的结果集完全相同。这是在MS SQL Server中进行的操作。我无法解释这种差异,希望有其他人可以解答。 - Emperor Eto
@PeterMoore,你也和我一样没有重复项吗?当我在一个10秒的查询中检查它时,我也看不到两者之间的速度差异,但是对于大表来说,“union all” 必须更快这一点也无可厚非。也许只有在存在使“union”和“union all”返回不同结果的情况下才会变得重要=如果您有重复项。我知道这毫无意义。 - questionto42

4

UNION在内部实现了两个查询。 1. SELECT将返回一个数据集 2. DISTINCT。任何学过数据库内部的人都可以轻松理解,DISTINCT子句在处理方面非常昂贵。

如果您确信结果数据集不需要唯一行,则可以跳过UNION并改用UNION ALL

UNION ALLUNION相同,但它不会在内部触发DISTINCT,从而节省了我们昂贵的操作。


3

如果您确定需要所有的结果行,无论是否知道它们是否不同,最好使用UNION ALL。没有“all”的UNION将始终执行“distinct check”,而不管实际数据是什么。


3

为什么UNION ALL更快?因为UNION必须进行排序以去除重复项。如果您不需要去除重复项,则UNION ALL是更好的选择,但是在适当的情况下应使用UNION。


0

我要冒昧地建议这取决于你的数据。

如果性能是从客户端发送请求的第一个字节到收到响应的最后一个字节所测量的(即端到端测量),则有以下两个极端:

  1. 结果集的绝大多数(比如说99%)包含重复项
  2. 结果集的绝大少数(比如说1%)包含重复项

在情况1中,UNION ALL会更快,因为它无需对数据进行排序(以删除重复项)即可返回它。

在情况2中,UNION会更快,因为在将重复项发送到网络之前,从内存中删除重复项要比将它们发送到网络上更快。如果您的结果集包含100万行,其中仅有2个唯一值,则一旦删除了这些重复项,您的网络时间将大大缩短。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接