UNION 和 CONCATENATION 运算符在性能方面有啥区别?
Posted
技术标签:
【中文标题】UNION 和 CONCATENATION 运算符在性能方面有啥区别?【英文标题】:What is the difference between the UNION and CONCATENATION operators in terms of performance?UNION 和 CONCATENATION 运算符在性能方面有什么区别? 【发布时间】:2019-10-23 10:39:07 【问题描述】:有时,可以在解释计划中看到 CONCATENATION 步骤。
我想知道联合和连接运算符在性能调优方面有什么区别?
【问题讨论】:
【参考方案1】:首先,UNION
和 CONCATENATION
略有不同。
CONCATENATION
等价于UNION-ALL
。这会组合输入表并返回所有行。
UNION
组合输入表。然后返回 distinct 行。
所以UNION
与CONCATENATION
相比具有额外的排序/区分操作。这种影响有多大取决于您的数据集。
当优化器执行 OR 扩展时,您会看到 CONCATENATION
。但请注意,从 Oracle Database 12.2 开始,this has changed:
CONCATENATION 已替换为 UNION-ALL。 如果适用,每个 UNION-ALL 分支都可以进行进一步的查询转换。这是不可能的 串联。 并行查询可以同时执行 UNION-ALL 分支。同样,这对于 CONCATENATION 是不可能的。
所以UNION-ALL
可以为它下面的每个操作提出更好的计划。并同时运行这些(如果使用并行)。所以在很多情况下,这会比CONCATENATION
更快。
【讨论】:
【参考方案2】:UNION 必须删除重复项,这很昂贵。 CONCATENATION 是执行 UNION ALL 时发生的步骤(它不会删除重复项,因此更便宜)。
【讨论】:
以上是关于UNION 和 CONCATENATION 运算符在性能方面有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
SqlServer中的UNION操作符在合并数据时去重的原理以及UNION运算符查询结果默认排序的问题
为啥使用 UNION 运算符的相同查询比使用 UNION ALL 的成本低得多?
union all这样写为啥提示“使用 UNION、INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有