0

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

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 仅包含内联所包含的 id 的一小部分,但它是一对多的关系。因为 inline 包含一个分组依据,优化器必须先对表中的每一行求和,然后才能加入。这使得这个子查询代表了工作估计成本的 99%。

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

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

4

1 回答 1

0

只要您使用的是 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
于 2018-07-24T13:37:03.787 回答