提问人:piezol 提问时间:6/28/2019 更新时间:7/6/2020 访问量:658
ODCIAggregateMerge 不带parallel_enabled
ODCIAggregateMerge without parallel_enabled
问:
以下是来自 Oracle 文档的引述:
[可选]通过合并两个聚合上下文进行合并,并返回单个上下文。此操作将子集的聚合结果组合在一起,以获得整个集合的聚合。在聚合的串行或并行评估期间,可能需要执行此额外步骤。如果需要,请在步骤 4 之前执行:
,
调用 ODCIAggregateMerge() 接口以在此类汇总操作中计算超级聚合值。
我们有一个聚合函数,我们不想并行运行。
原因是上下文的合并会消耗资源,并且会迫使我们使用与现在不同的数据结构,从而有效地抵消并行执行带来的任何性能优势。
因此,我们没有将函数声明为 parallel_enabled,而是在 ODCIAggregateMerge 中“以防万一”返回 ODCIconst.Error。
但是,第一个引用文档声称,即使在串行评估中也可能发生合并。
超级聚合(rollup、cube)是明显的例子,但还有其他例子吗?
我完全无法用简单的分组方式重现它,没有parallel_enabled就永远不会调用合并,而且似乎总是在组内只创建一个上下文。
是否可以安全地假设,如果没有parallel_enabled集,合并将永远不会运行?
你有没有见过这个规则的反例?
答:
0赞
Sayan Malakshinov
7/6/2020
#1
我认为你可以在某些转换的情况下得到这一点,例如,group-by 放置或 OR-Expansion,其中 group by 被转换为几个带有“union all”的 group-by 嵌套查询,或者分组集,或者在复杂连接的情况下进行组修剪。
评论
GROUP BY GROUPING SETS(...)
ODCIAggregateMerge
with t as (select 1 x from dual union all select 2 from dual) select t.x, count(1) from t group by rollup(t.x)