我需要在多个表中运行一个SELECT语句。我确定这些表会返回不同的记录。不过我仍然使用UNION ALL。
在性能方面,当我确定这些表会返回不同的记录时,是使用UNION还是UNION ALL更好?
我需要在多个表中运行一个SELECT语句。我确定这些表会返回不同的记录。不过我仍然使用UNION ALL。
在性能方面,当我确定这些表会返回不同的记录时,是使用UNION还是UNION ALL更好?
如果您不需要消除重复记录,那么使用UNION ALL比使用UNION表现更佳,因为它避免了昂贵的去重排序操作。详情请参阅:SQL SERVER - Union与Union All的差异-最佳性能比较
UNION ALL 总是更快,因为 UNION 会排除重复的条目。
UNION在内部实现了两个查询。
1. SELECT
将返回一个数据集
2. DISTINCT
。任何学过数据库内部的人都可以轻松理解,DISTINCT
子句在处理方面非常昂贵。
如果您确信结果数据集不需要唯一行,则可以跳过UNION
并改用UNION ALL
。
UNION ALL
与UNION
相同,但它不会在内部触发DISTINCT
,从而节省了我们昂贵的操作。
如果您确定需要所有的结果行,无论是否知道它们是否不同,最好使用UNION ALL。没有“all”的UNION将始终执行“distinct check”,而不管实际数据是什么。
为什么UNION ALL更快?因为UNION必须进行排序以去除重复项。如果您不需要去除重复项,则UNION ALL是更好的选择,但是在适当的情况下应使用UNION。
我要冒昧地建议这取决于你的数据。
如果性能是从客户端发送请求的第一个字节到收到响应的最后一个字节所测量的(即端到端测量),则有以下两个极端:
在情况1中,UNION ALL会更快,因为它无需对数据进行排序(以删除重复项)即可返回它。
在情况2中,UNION会更快,因为在将重复项发送到网络之前,从内存中删除重复项要比将它们发送到网络上更快。如果您的结果集包含100万行,其中仅有2个唯一值,则一旦删除了这些重复项,您的网络时间将大大缩短。