ODCIAggregateMerge 不带parallel_enabled

ODCIAggregateMerge without parallel_enabled

提问人:piezol 提问时间:6/28/2019 更新时间:7/6/2020 访问量:658

问:

以下是来自 Oracle 文档的引述:

[可选]通过合并两个聚合上下文进行合并,并返回单个上下文。此操作将子集的聚合结果组合在一起,以获得整个集合的聚合。在聚合的串行或并行评估期间,可能需要执行此额外步骤。如果需要,请在步骤 4 之前执行:

,

调用 ODCIAggregateMerge() 接口以在此类汇总操作中计算超级聚合值。

我们有一个聚合函数,我们不想并行运行。
原因是上下文的合并会消耗资源,并且会迫使我们使用与现在不同的数据结构,从而有效地抵消并行执行带来的任何性能优势。

因此,我们没有将函数声明为 parallel_enabled,而是在 ODCIAggregateMerge 中“以防万一”返回 ODCIconst.Error。

但是,第一个引用文档声称,即使在串行评估中也可能发生合并。
超级聚合(rollup、cube)是明显的例子,但还有其他例子吗?

我完全无法用简单的分组方式重现它,没有parallel_enabled就永远不会调用合并,而且似乎总是在组内只创建一个上下文。

是否可以安全地假设,如果没有parallel_enabled集,合并将永远不会运行?
你有没有见过这个规则的反例?

SQL Oracle PLSQL 聚合

评论

1赞 Matthew McPeak 8/30/2019
需要明确的是,您正在寻找超级聚合之外的示例(例如,?Oracle 19c 中的文档添加了以下行:“如果用户定义的聚合 * 是一个窗口函数*,并且无法实现 ODCIAggregateMerge(),则 ODCIConst.Error应返回。此错误被转换为 Oracle 用户错误。我从中推断,至少有一个分析函数案例将调用合并,但我不能说它会是什么。GROUP BY GROUPING SETS(...)ODCIAggregateMerge
0赞 piezol 9/2/2019
是的,我确实知道为什么在超级聚合中调用合并(例如,这里对于 null x 聚合上下文可以简单地合并,而不是第二次调用函数。我正在寻找的是超级聚合之外的案例。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)
0赞 piezol 9/2/2019
此外,我的函数是一个常规聚合 - 我不知道为什么 oracle 在那里指定了窗口函数。我们使用 Oracle 11g
0赞 Padders 2/14/2020
您的函数不仅仅是一个常规聚合。用户定义的聚合显然具有分析/窗口函数支持。
0赞 Matthew McPeak 5/3/2022
出于某种原因,这出现在我的 SO“未回答的问题”视图的顶部,尽管它很旧。另一个想法是,在大型哈希联接中,构建表太大而无法放入 PGA 内存中,联接的行分几次输出。也许,如果涉及聚合,Oracle 可能会从每个传递中计算聚合,然后合并它们?只是一个理论 -- 现在不打算尝试一下。

答:

0赞 Sayan Malakshinov 7/6/2020 #1

我认为你可以在某些转换的情况下得到这一点,例如,group-by 放置或 OR-Expansion,其中 group by 被转换为几个带有“union all”的 group-by 嵌套查询,或者分组集,或者在复杂连接的情况下进行组修剪。