【问题标题】:Oracle Tuning Inline View with group byOracle Tuning Inline View with group by
【发布时间】:2018-07-24 03:55:17
【问题描述】:

我有一个过于复杂的查询,其中包含一个内联视图,其中包含一个分组依据,出于性能原因,我希望尝试将其删除,但我似乎想不出这样做的方法。此查询的过度简化表示是:

Select inline.totalValue, inline.type, everythingElse.*
From everythingElse,
(Select sum(value) totalValue, type, id
from otherTable
group by type, id) inline
Where everythingElse.id = inline.id

everythingElse 仅包含 inline 包含的 id 的一小部分,但它是一对多的关系。因为 inline 包含一个 group by,优化器必须先对表中的每一行求和,然后才能加入。这使得这个子查询代表了工作估计成本的 99%。

由于选择使用内联的 2 个值,我不认为将子查询更改为嵌套子查询或标量子查询是一种选择。我还考虑过移动组以包含整个查询,但是我知道的每个聚合函数都会导致everythingElse.* 花费的时间比我通过删除内联视图节省的时间要多。我能找到的最快的处理方法是 max(),但如果存在类似 any() 的东西,那可能会解决我的问题。

我是否缺少某种明显的解决方案,或者我是否只需要处理 1% 的查询占用 99% 的处理时间这一事实?

【问题讨论】:

    标签: oracle group-by subquery sql-tuning inline-view


    【解决方案1】:

    只要您使用的是 12c 或更高版本,您就可以尝试使用cross apply。我不确定它是否会改善您的具体情况,但值得一试。

    Select inline.totalValue, inline.type, everythingElse.*
    From everythingElse
    cross apply
    (Select sum(value) totalValue, type, id
    from otherTable
    where everythingElse.id = otherTable.id
    group by type, id) inline
    

    【讨论】:

    • 这种工作。我现在也在试验横向连接,这是我在研究交叉应用时发现的。我这么说是因为内联的解释计划看起来好多了,但是优化器改变了它访问所有其他部分的方式,这似乎使查询总体上变得更糟。这些部分大部分与内联没有直接关系,所以我认为优化器只是很傻。
    猜你喜欢
    • 2020-08-02
    • 2017-03-22
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多