我必须在几个表中运行SELECT语句。我确信这些表返回不同的记录。我反正使用UNION ALL。当我确信表返回不同的记录时,从性能方面来看,使用UNION或UNION ALL哪个更好?
imzjd6km1#
当您不关心消除重复记录时,UNION ALL的性能优于UNION,因为您避免了开销较大的distinct sort操作。请参阅:SQL SERVER – Difference Between Union vs. Union All – Optimal Performance Comparison
6tdlim6h2#
UNION ALL总是较快,因为UNION排除重复的条目
f0brbegy3#
UNION在内部实现了两个查询。1.SELECT,它将返回一个数据集2.DISTINCT。任何研究过数据库内部的人都可以很容易地理解,就处理而言,DISTINCT子句的开销是非常大的。如果您非常确定生成的数据集不需要具有唯一的行,那么我们可以跳过UNION而使用UNION ALL。UNION ALL将与UNION相同,不同之处在于它不触发DISTINCT,从而在内部节省了成本高昂的操作
SELECT
DISTINCT
UNION
UNION ALL
lhcgjxsq4#
当你知道你想要所有的结果行时,不管你是否知道它们是不同的,最好使用UNION ALL。没有“all”的UNION将总是执行“不同的检查”,不管数据实际上是什么。
1qczuiv05#
为什么UNION ALL更快?因为UNION必须进行排序以删除重复项。如果不需要删除重复项,则UNION ALL是更好的选择,但UNION有其用途,应在适当的时候使用。
rnmwe5a26#
我想大胆地说,这取决于你的数据。如果性能是端到端测量的(从客户端发送请求的第一个字节到它收到响应的最后一个字节),那么您有以下两个极端:1.结果集中的绝大多数(比如1%)包含重复项1.结果集中的绝大多数(比如99%)都包含重复项在案例1中,UNION ALL会更快,因为它不需要在返回数据之前对数据进行排序(以删除重复项)。在第2种情况下,UNION会更快,因为在内存中删除重复项比通过网络发送要快得多。如果结果集包含100万行,其中只有2个唯一值,那么一旦删除了这些重复项,网络时间就会小得多。
6条答案
按热度按时间imzjd6km1#
当您不关心消除重复记录时,UNION ALL的性能优于UNION,因为您避免了开销较大的distinct sort操作。请参阅:SQL SERVER – Difference Between Union vs. Union All – Optimal Performance Comparison
6tdlim6h2#
UNION ALL总是较快,因为UNION排除重复的条目
f0brbegy3#
UNION在内部实现了两个查询。1.
SELECT
,它将返回一个数据集2.DISTINCT
。任何研究过数据库内部的人都可以很容易地理解,就处理而言,DISTINCT
子句的开销是非常大的。如果您非常确定生成的数据集不需要具有唯一的行,那么我们可以跳过
UNION
而使用UNION ALL
。UNION ALL
将与UNION
相同,不同之处在于它不触发DISTINCT
,从而在内部节省了成本高昂的操作lhcgjxsq4#
当你知道你想要所有的结果行时,不管你是否知道它们是不同的,最好使用UNION ALL。没有“all”的UNION将总是执行“不同的检查”,不管数据实际上是什么。
1qczuiv05#
为什么UNION ALL更快?因为UNION必须进行排序以删除重复项。如果不需要删除重复项,则UNION ALL是更好的选择,但UNION有其用途,应在适当的时候使用。
rnmwe5a26#
我想大胆地说,这取决于你的数据。
如果性能是端到端测量的(从客户端发送请求的第一个字节到它收到响应的最后一个字节),那么您有以下两个极端:
1.结果集中的绝大多数(比如1%)包含重复项
1.结果集中的绝大多数(比如99%)都包含重复项
在案例1中,UNION ALL会更快,因为它不需要在返回数据之前对数据进行排序(以删除重复项)。
在第2种情况下,UNION会更快,因为在内存中删除重复项比通过网络发送要快得多。如果结果集包含100万行,其中只有2个唯一值,那么一旦删除了这些重复项,网络时间就会小得多。