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】:

首先,UNIONCONCATENATION 略有不同。

CONCATENATION 等价于UNION-ALL。这会组合输入表并返回所有行。

UNION 组合输入表。然后返回 distinct 行。

所以UNIONCONCATENATION 相比具有额外的排序/区分操作。这种影响有多大取决于您的数据集。

当优化器执行 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运算符

union all这样写为啥提示“使用 UNION、INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有

union 和 join 和有啥不一样?

union 和 join 和有啥不一样?